Сегодня я вернулся домой с работы (запустил bash на коробке с Ubuntu) и попытался запустить какой-то код на моей локальной коробке с моим любимым zsh, и команды не выполнялись?
Команда внизу с личной информацией и ip явно изменилась
ffmpeg -i rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264 -threads 3 -vcodec copy -f segment -segment_time 2 outfiles/cam_out%04d.mp4
Он отлично работает в bash, но когда я запускаю его в zsh, я получаю сообщение об ошибке
zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264
Почему мой любимый зш предал меня?
mkdir -p 'rtsp://user:pass@my.webserver.org:5554/my-media/media.amp-videocodec=h264'
и тогда bash и zsh тебя не подведут. По крайней мере, Zsh показывает вам вашу ошибку здесь.Ответы:
В строке:
у вас есть
?
в этой строке, поэтому оболочка будет выполнять расширение пути к этой строке, используя правила сопоставления с образцом .В
bash
, еслиfailglob
параметры не установлены, что по умолчанию, затем не шаблон будет оставлен как есть:Хотя
zsh
будет сообщать об отсутствии совпадения с шаблоном сnomatch
установленным параметром, который используется по умолчанию:Вы можете сделать
zsh
подавление ошибки и распечатать шаблон:Вы можете заставить
bash
себя вести себя какzsh
сnomatch
установленной опцией, включивfailglob
:В более общем смысле, вы можете отключить генерацию имени оболочки:
(или
set -o noglob
,set +o noglob
)или используя один из методов цитирования оболочки, чтобы
?
буквально обрабатывать оболочку и другие шаблоны, соответствующие специальным символам.zsh
также предоставьтеnoglob
встроенную функцию, которая отключает генерацию имени файла в любых словах для следующей простой команды:источник
noglob
перед ней команду. Например,noglob echo *
будет просто вывод*
.