Обработка "?" символ передан функции ZSH

У меня проблема с настройкой простой функции в ZSH.

Я хочу сделать функцию, которая скачивает только mp3-файл с YouTube.

Я использовал youtube-dl, и я хочу сделать простую функцию, чтобы сделать это легко для меня

ytmp3(){
  youtube-dl -x --audio-format mp3 "$@"}

Поэтому, когда я пытаюсь

ytmp3 https://www.youtube.com/watch?v=_DiEbmg3lU8

я получил

zsh: no matches found: https://www.youtube.com/watch?v=_DiEbmg3lU8

но если я попробую

ytmp3 "https://www.youtube.com/watch?v=_DiEbmg3lU8"

оно работает. Я понял, что программа запускается (но ничего не загружается), если я удалю все символы после? включая это. Так что я думаю, что это какой-то специальный символ для Zsh.

2 ответа

Решение

Знак вопроса является частью сопоставления с образцом ZSH, аналогично *. Это означает "любой персонаж".

Например, ls c?nfig выведет список "config" и "cinfig", если они существуют.

Итак, да, ваша проблема просто в том, что zsh пытается интерпретировать? в URL-адресе в качестве шаблона для сопоставления с файлами, не найдя ни одного, и вычеркивая. Сбежать? с \ или поставить кавычки вокруг него, как вы сделали, чтобы исправить это.

По умолчанию ZSH будет пытаться "связать" шаблоны, которые вы используете в командной строке (он будет пытаться сопоставить шаблон с именами файлов). Если он не может найти совпадение, вы получите сообщение об ошибке ("совпадений не найдено").

Вы можете отключить это поведение, отключив nomatch опция:

unsetopt nomatch

Страница руководства описывает эту опцию следующим образом (она описывает, что происходит, когда эта опция включена):

Если шаблон для создания имени файла не имеет совпадений, выведите ошибку, а не оставляйте ее без изменений в списке аргументов.

Попробуйте еще раз с отключенной опцией:

$ unsetopt nomatch
$ ytmp3 https://www.youtube.com/watch?v=_DiEbmg3lU8

Если вы хотите навсегда отключить эту опцию, вы можете добавить команду отключения к вашему ~/.zshrc файл.

Другие вопросы по тегам