zshコマンドの位置パラメータに配列要素を挿入するには?

zshコマンドの位置パラメータに配列要素を挿入するには?

実行時にのみ知っている特定の拡張子を持つすべてのファイルをリストする必要があります(特定のファイルなど)。または、拡張子が変数に保存されます。

fdコマンドを使用してリストしたいです。複数の拡張子を持つすべてのファイルを一覧表示するコマンドはfd -e java -e c ...

私はそれを管理するために2つの方法を試しましたが、両方とも見苦しく見えます。

!/bin/zsh
str="c java"
extensions=(${=str})
arguments=(" -e "${^extensions})
# Why `arguments=" -e "${^extensions};echo $arguments` output  -e c java
fd ${=arguments}
!/bin/zsh
str="c java"
extensions=(${=str})
option=(" -e ")
arguments=${option:^^extensions}
fd ${=arguments}

こんな一行のコードがあってほしいですfd ${=${(" -e "):^^(${=str})}}

別の質問があります。最初のコードブロックでarguments=" -e "${^extensions};echo $arguments「-ec -e java \ n」の代わりに「-ec java \ n」が出力されるのはなぜですかarguments=(" -e "${^extensions}); echo $arguments

答え1

再分割する前に分割し、str-e配列要素に追加します。

% str="c java"
% print -lr -- ${=${${=str}/#/-e }}
-e
c
-e
java

最初のステップは文字列をリストに分割することで、必要以上に醜く脆弱です。リストを配列に配置したら、前に追加して分割できます。

% a=(c java)
% print -lr -- ${=${a/#/-e }}
-e
c
-e
java

ただし、分割はIFS短いがスペースを含む入力(またはより一般的には文字)で分割されるため、正しくありません$IFS

% a=(c java "with spaces")
% print -lr -- ${=${a/#/-e }}
-e
c
-e
java
-e
with
spaces

パラメータ拡張を含む正しい行のコードがないと思います。Pglobとして1つを活用し、それを別の配列に置き換えることができる見苦しいglob修飾子があります。

% a=(c java "with spaces")
% print -lr -- .(P\''-e'\'e\''reply=($a)'\')
-e
c
-e
java
-e
with spaces

str="c java"
extensions=(${=str})
# Why `arguments=" -e "${^extensions};echo $arguments` output  -e c java

文字列を生成しているからです。文字列コンテキストではこの^フラグは適用されません。これが行うことは個々の配列要素を作成することですが、コンテキストが配列を許可しない場合はこれを行うことはできません。

関連情報