簡単なファイル名の生成例から始めましょう。
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
cmd
withの出力にある単語を連結し、|
それをglobとして解釈します。b
単語自体をパターンと見なしたくない場合は、パラメータ拡張フラグも参照してください。
echo (${~${(j:|:)${(b)$(cmd)}}}).txt