このffmpegコマンドがbashでは機能しますが、zshでは機能しないのはなぜですか?

このffmpegコマンドがbashでは機能しますが、zshでは機能しないのはなぜですか?

私は今日退勤し、家に帰って(Ubuntuシステムでbashを実行する)私が愛しているzshを使ってローカルアーチシステムでいくつかのコードを実行しようとしましたが、コマンドは失敗しました。

次のコマンドは、プライバシーとIPを明確に変更します。

ffmpeg -i rtsp://user:[email protected]: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:[email protected]:5554/my-media/media.amp?videocodec=h264

私の愛するzshはなぜ私を裏切ったのですか?

答え1

文字列から:

rtsp://user:[email protected]:5554/my-media/media.amp?videocodec=h264

すでに?その文字列にあるため、シェルが実行されます。パス名拡張その文字列で次を使用します。パターンマッチングルール。

でオプションが設定されていないbash場合failglob(デフォルト)、失敗モードはそのまま残ります。

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

オプション set については、パターン一致エラーは報告されませんが、zshデフォルトは次のとおりです。nomatch

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

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

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

以下をオンにして、オプションセットbashと同様の動作を作成できます。zshnomatchfailglob

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

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

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

(またはset -o noglobset +o noglob

またはシェルのいずれかを使用してください引用する?文字通り、特殊文字を他のパターンと一致させるシェルハンドルを作成する方法です。


zshnoglob次の簡単なコマンドのファイル名生成を無効にすることができる組み込み関数も提供されています。

$ noglob echo *
*

関連情報