watchコマンドでコマンド出力を引数として使用する

watchコマンドでコマンド出力を引数として使用する

私には時計があります

jq -r '.' $(ls -t | head -1)"

目標は、ディレクトリ内の最後に変更されたファイルに "jq -r '.'"を適用することです。残念ながら、ファイルが最後に変更された時期を確認するために使用されるコマンドは、リフレッシュ時ではなく監視が開始されたときに評価されます。更新するたびに、すべてのコマンドが再評価されるようにどのように書く必要がありますか?

ありがとう

答え1

単一引用符でコマンドを渡すと、watchコマンドが実行されるのではなく、監視サイクルごとに拡張されます。たとえば、次のようになります。

watch echo $(date)

watch 'echo $(date)'

最初のコマンドは元の日付を印刷し続け、2番目のコマンドは1サイクルごとに実行され、date別の日付を印刷します。

これは、リテラル文字列をecho $(date)watchコマンドに渡してサイクルごとに実行し、正しい日付を表示するためです。引用符を使用しないと、シェルは$(date)それを拡張してdateコマンドの出力に置き換えてに渡すため、watch同じ出力を繰り返し印刷します。

答え2

コマンドの主な問題は、コマンドを実行するときです。

watch jq -r '.' "$(ls -t | head -1)"

...コマンド置換は、コマンドのコマンドライン引数を評価するプロセスの一部として一度行われますwatch

コマンドが実行されるたびに、評価された代替項目でコマンドが実行されるように、開始時に現在のシェルがコマンド代替項目の評価を停止するwatch必要があります。watch

あなたはこれを行うことができます

watch 'jq -r . "$(ls -t | head -1)"'

ディレクトリで最後に変更された一般的なファイル(おそらくシンボリックリンク)は、シェルのファイル名の*(.om[1])グロービングパターンとして提供されますzsh。角かっこは、以前の名前の一致方法を定義します*。ドットは通常のファイル(シンボリックリンクファイルである可能性があります)のみを選択し、om最後に変更されたタイムスタンプ()に基づいてソートし、結果リストから最初の名前のみを選択します。om[1]

したがって、コマンドを書く別の方法は

watch -x zsh -c 'jq . *(.om[1])'

ここでは、-xコマンドを実行するのではなく、コマンドの理由を提供します。watchexecsh -c

関連情報