Чому ця команда ffmpeg працює в bash, а не zsh?


17

Сьогодні я повернувся додому з роботи (запустіть 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

Чому коханий zsh зрадив мене?


7
Спробуйте ввести посилання rtsp в одиничні лапки.
jimmij

1
ти мій герой :) Я знав, що zsh не підведе мене.
Джон Аллард

1
Спробуйте після, mkdir -p 'rtsp://user:pass@my.webserver.org:5554/my-media/media.amp-videocodec=h264'і тоді і bash, і zsh не вдасться. Принаймні zsh показує вам свою помилку тут.
Стефан Шазелас

@cuonglm, я мав на увазі, що коли є файл, що відповідає шаблону, і zsh, і bash будуть "провалюватися" в тому, що глобус буде розширений. Поведінка zsh є безпечнішою в тому, що коли немає відповідності, це змушує усвідомити свою помилку.
Стефан Шазелас

Відповіді:


43

У рядку:

rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264

у вас є ?цей рядок, тож оболонка буде виконувати розширення імені тракту на цій рядку, використовуючи правила відповідності шаблону .

В bash, якщо failglobпараметри не встановлені, що по замовчуванню, потім НЕ шаблон буде залишений як є:

$ echo does-not-exist?
does-not-exist?

Хоча zshбуде повідомлено про помилку відповідності шаблону з nomatchнабором параметрів, який за замовчуванням:

$ echo does-not-exist?
zsh: no matches found: does-not-exist?

Ви можете zshпридушити помилку і надрукувати шаблон:

$ setopt nonomatch
$ echo does-not-exist?
does-not-exist?

Ви можете bashповодитись так, як zshіз nomatchнабором опцій, увімкнувши failglob:

$ shopt -s failglob
$ echo does-not-exist?
bash: no match: does-not-exist?

Більш загально, ви можете відключити генерацію імені файлу оболонки:

$ set -f
$ : "The command"
$ set +f

(або set -o noglob, set +o noglob)

або використовуючи один із способів цитування оболонок, щоб ?буквально лікувати оболонки та інші зразки, що відповідають спеціальним символам.


zshтакож надайте noglobвбудований файл, який відключає генерацію імен файлів будь-якими словами для наступної простої команди:

$ noglob echo *
*

о, вау, це якось соромно пропустити, дякую за гарну відповідь.
Джон Аллард

Але тепер це змушує мене запитати: як би хтось це виправити? Використовуючи цитати? Щось ще? Надмірно складна кішка + передшлунки? Було б добре, якби ви додали це до своєї відповіді, щоб було трохи більш загальним і все-таки дуже повним і правильним.
Ісмаїл Мігель

Тепер це надзвичайна відповідь! Я відповідно підтримав. Відповіді справді бракувало останнього шматочка. Він розповів, що не так, але не виправити. Дякую.
Ісмаїл Мігель

Інша альтернатива: У zsh ви можете відключити глобалізацію лише для поточної команди, попередньо додавши noglobдо команди. Наприклад, noglob echo *вийде просто *.
wjv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.