mpv
ネットワークストリームとして再生するURLを渡そうとします。
bash
これは次の構文を使用して実行できます。
$ mpv http://myvideosite.com
しかし、zsh
URLを(おおよそ)ファイルパスとして評価したいと思います。走る
% mpv http://myvideosite.com
次のような答えを受けました:
zsh: no matches found: http://myvideosite.com
戻りコードは1です。
走る
% mpv "http://myvideosite.com"
期待通りに行われます。
zsh
パラメータを文字列として処理しませんか?
答え1
コマンドラインの重要な部分を誤って削除したとします。問題のURLに?
文字(または*
)が含まれています。シェルの特殊グローバルマッチング文字です?
。ファイル名の単一文字と一致し、複数の文字と一致します。次のように言うとき:*
?
*
zsh
zsh: no matches found: http://myvideosite.com?video=123
http://myvideosite.com?video=123
現在、ディレクトリにアクセス可能なファイルがないというメッセージが表示されます。
zshでは、このような拡張失敗はデフォルトではエラーですが、Bashではそうではありません。失敗したモードは作成されたまま引数として保持されます。 zsh の動作はファイルがないため、意図したとおり秘密に実行しないコマンドを作成できないという点でより安全ですが、必要に応じて Bash 動作を持つように変更できます。
setopt nonomatch
これNOMATCH
オプションはデフォルトでオンになっています。、表示されるエラーが発生します。無効にすると、setopt nonomatch
失敗したグローバル拡張はコマンドラインで変更されていません。
$ echo foo?bar
zsh: no matches found: foo?bar
$ setopt nonomatch
$ echo foo?bar
foo?bar
これにより、元のユースケースが解決されます。一般に、エラーを避けるために、パラメータを特殊文字として引用することをお勧めします。つまり、ファイルがその名前で存在するか、または存在すると考えると存在しない場合があります。