qstat
私は実行中のジョブのIDを提供するサーバーで実行しています(詳細は重要ではありません)。たとえば、、、、、、123
3つのタスクを実行しているとします124
。125
> 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シェルの荷物は含まれていません。rc
es
fish