zshで{1..9}を使用してこのエラーが発生するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/805361

  •  03-07-2019
  •  | 
  •  

質問

次のコードを実行します

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]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top