zshで{1..9}を使用してこのエラーが発生するのはなぜですか?
質問
次のコードを実行します
zgrep -c compinit /usr/share/man/man{1..9}/zsh*
わかります
zsh: no matches found: /usr/share/man/man2/zsh*
次のように動作するため、これは奇妙です
echo Masi{1..9}/masi
これは、問題がZshのバグである可能性を示唆しています。
上記は{1..9}のZshのバグですか?
解決
これはバグではなく、言葉の中でうまく機能しています。ここでの問題は、 {1..9}
が *
のようなワイルドカード表現ではないことです。エコーの例が示すように、これは反復的な拡張です。したがって、zgrepの例は、コマンドラインに各代替バージョンを入力した場合とまったく同じであり、man2にはzshで始まるマニュアルページがないためエラーになります。 (一致を見つけることができなかった場合はエラーになります。ブレースシーケンスの展開に本質的に関連するものではありません。)
これを行う場合、一方で:
zgrep -c compinit /usr/share/man/man[1-9]/zsh*
[1-9]
は通常のワイルドカード表現であるため、期待する結果が得られます。
他のヒント
zshでは、ファイル名に範囲を使用する場合、zleは展開可能な実際の名前で< 1-n>
を提供します。つまり:
$ touch a0b a1b a5b a7b
$ print a<0-100>b
次に、最後の b
の直後に&lt; Tab&gt;
を押すと、行に print a0b a1b a5b a7b
が展開されます。
他のすべての意図と目的-おそらくフルレンジの要件、非ファイルおよびスクリプトの使用-については、かなり簡潔な慣用的なzshループを使用してこれを次のように表現します。
for n ({1..50}); do print $n; done
1〜50の数字のシーケンス範囲全体を処理できます。その後、まだ存在しないファイルコレクションなど、あらゆる種類の有用な処理を実行できます。
arr=($(for n ({1..50}); do print /my/path/file$n.txt; done)) && print $arr[33]
所属していません StackOverflow