このffmpegコマンドがzshではなくbashで機能するのはなぜですか?


17

今日、私は仕事から家に帰り(Ubuntuボックスでbashを実行)、私の大好きな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?

while zshnomatch、デフォルトのオプションセットでパターンマッチエラーを報告しません。

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

zshエラーを抑制してパターンを印刷できます。

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

あなたは作ることができるbashように振る舞うのzshnomatchオンにすることで、オプションのセットfailglob

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

より一般的には、シェルファイル名の生成を無効にできます。

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

(またはset -o noglobset +o noglob

または、シェルのクォート方法のいずれかを使用して、シェルで?特殊文字と文字通り一致するように処理します。


zshまたnoglob、次の単純なコマンドの単語のファイル名生成を無効にする組み込み機能も提供します。

$ noglob echo *
*

ああ、すごい返事をありがとう、見逃したのはちょっと恥ずかしい。
ジョンアラード

しかし今、これは私に疑問を投げかけます:誰かがそれをどのように修正しますか?引用符を使用して?他に何か?複雑すぎる猫とサブシェル?これを回答に追加して、もう少し一般的でありながら非常に完全で正しいものにするとよいでしょう。
イスマエルミゲル

今、それは素晴らしい答えです!私はそれに応じて賛成しました。答えは本当に最後の部分に欠けていました。何が間違っているのかを伝えたが、修正はしなかった。ありがとうございました。
イスマエルミゲル

別の代替方法:zshではnoglob、コマンドの先頭に追加することにより、現在のコマンドに対してのみグロビングを無効にできます。たとえば、noglob echo *単に出力されます*
wjv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.