私は今日退勤し、家に帰って(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
と同様の動作を作成できます。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 *
*