ワイルドカード拡張 zsh

ワイルドカード拡張 zsh

qstat私は実行中のジョブのIDを提供するサーバーで実行しています(詳細は重要ではありません)。たとえば、、、、、、1233つのタスクを実行しているとします124125

> qstat
123
124
125

各ジョブにはログファイルがありますlogs/tail -Fすべてのジョブのログファイルが必要です。

私は前に試しました

tail -F $(qstat | awk -v P=logs '{ print P"/*"$1 }' | paste -sd " ")

しかし、私は理解しています

tail: cannot open logs/*123 for reading: No such file or directory

すべての職業について。


私は走っていますzshが、同じことが当てはまりますbash

明らかに$(...)の後にはワイルドカード拡張はありません。できますか?この問題をどのように解決できますかzsh

答え1

globsubstはい、コマンドを置き換えるときにファイル名拡張やその他の拡張は通常必要ありません。sh / kshエミュレーション(オプション)を除いて、zshではデフォルトでファイル名拡張は行われません。

globsusbtを使用して特定のコマンド置換を要求できますが${~$(...)}(btw、その部分は必要ありません。pasteスペースと改行がデフォルト値にある$IFS)、zshを使用するより良いアプローチは次のとおりです。

ids=($(qstat))
tail -F logs/*${^ids}

これらのglobのいずれかのファイルと一致できない場合、コマンドは中断されます。

tail -F logs/*${^ids}(N)

(N)有効空のボールtail -Fそのグローバル変数の場合)はこれを防ぎますが、ファイルがまったくない場合は引数なしで実行されます(参照nullglobがデフォルトではないのはなぜですか?)。

次のこともできます。

logs=(logs/*${^$(qstat)}(N))
(($#logs)) && tail -F $logs

1と他のBourneのようなシェルがこれをするという事実はbashバグと見なすことができます。これが理由の一つですすべての変数を引用する必要がありますまたは、分割部分だけが必要な場合、分割+globset -o noglobの前に引用符を使用しないのはなぜですか?たとえば、$(...)より現代的なシェルにはBourneシェルの荷物は含まれていません。rcesfish

関連情報