コマンド置換を使用して glob パターンのネストされた部分を生成する

コマンド置換を使用して glob パターンのネストされた部分を生成する

簡単なファイル名生成の例から始めましょう。

echo (xx|yy|zz)*.txt  # Example 1

これは、xx または yy または zz で始まるすべての txt ファイルをリストします。次に、コマンド置換を使用してこれらの代替を動的に生成します。echoここでは、目的を示すためにのみ使用しています。「実際の」例では、もちろん、これは次のようなプログラムになります。

echo $(echo '(xx|yy|zz)')*.txt  # Example 2

これは上記のように動作します。ここで難しい部分があります。コマンド置換は、選択肢のリストの一部のみを提供する必要があります。

echo ($(echo 'xx|yy')|zz)*.txt  # Example 3 (does not work)

これはもう機能しません。zz で始まるファイルは見つかりますが、yy で始まるファイルは見つかりません。Zsh は文字通りxx|yyここで始まるファイルを検索していると思われます。

補助変数を使用すれば、これを動作させることができます。

list=$(echo 'xx|yy')
echo (${~list}|zz)*.txt   # Example 4

さて、私の質問です。

一時変数を使用せずに例 4 の効果を実現することは可能ですか?

答え1

次のように使用します:

echo (${~"$(echo 'xx|yy')"}|zz)*.txt

コマンド置換の周りの引用符に注意してください。これは、zshコマンド置換時にデフォルトでグロブを行わない場合、単語の分割を実行します。これは次のような場合に便利です。

echo (${~${(j:|:)$(cmd)}}).txt

cmdwithの出力内の単語を結合し|、それをグロブとして解釈します。bこれらの単語自体をパターンとして扱いたくない場合は、パラメータ拡張フラグも参照してください。

echo (${~${(j:|:)${(b)$(cmd)}}}).txt

関連情報