Обработка "?" символ передан функции 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
файл.