コマンド置換の結果を追加するには?

コマンド置換の結果を追加するには?

たとえば、mp3ファイルのリストを作成したいと思いますa 1.mp3|a 2.mp3

いくつかのバリエーションを試しましたが、うまくいきecho ${(j:|:)$(echo *.mp3)}ません。

# too much splitting 
01|The|Magic|Finger|01.mp3|02|The|Magic|Finger|02.mp3|03|The|Magic|Finger|03.mp3|04|The|Magic|Finger|04.mp3|05|The|Magic|Finger|05.mp3|06|The|Magic|Finger|06.mp3

# too much quoting
01 The Magic Finger 01.mp3 02 The Magic Finger 02.mp3 03 The Magic Finger 03.mp3 04 The Magic Finger 04.mp3 05 The Magic Finger 05.mp3 06 The Magic Finger 06.mp3

これを行うための関数や変数を作成したくありません。 (簡単にできます。)

答え1

mp3ファイルのリストを取得し、スペースechoで区切って印刷できるように渡し、出力をパイプして読み取り、スペース/タブ/改行/ NULに分割します|

次のいずれかを実行します。

printf '%s|' *.mp3

または

files=(*.mp3)
joined=${(j:|:)files}

これらのファイル名をパターンとして使用する場合は、zshワイルドカード文字をエスケープする必要があります。これはbパラメータ拡張フラグを介して行われます。

pattern="(${(j:|:)${(b@)files}})"

答え2

set以下を使用して、これらのファイルを場所パラメータに配置できます"$*"

set -- *.mp3
(IFS=\|; echo "$*")

これはサブシェルで行われるため、IFS への変更は現在のシェルには影響しません。

答え3

これを行う方法を見つけましたが、次の簡単なユースケースはまだ非常に複雑です。

echo ${(j:|:)"${(@f)$(print -l *.mp3)}"}

関連情報