パイプを使用したatrm保留操作

パイプを使用したatrm保留操作

at保留中のジョブキューにはいくつかのジョブがあります。

$ atq
28  Wed Oct 31 10:23:00 2018
27  Tue Oct 30 21:20:00 2018
25  Tue Oct 30 21:19:00 2018
26  Tue Oct 30 21:20:00 2018
20  Tue Oct 30 18:25:00 2018
30  Wed Oct 31 10:59:00 2018
32  Wed Oct 31 21:03:00 2018
23  Tue Oct 30 18:28:00 2018
31  Wed Oct 31 13:58:00 2018
19  Tue Oct 30 15:43:00 2018
21  Tue Oct 30 18:27:00 2018

作業番号を取得して削除したい

$ atq | awk '{print $1}'
20
30
32
23
31
19
21

しかし、期待どおりに動作しません。

$ atq | awk '{print $1}'| atrm ; atq
20  Tue Oct 30 18:25:00 2018
30  Wed Oct 31 10:59:00 2018
32  Wed Oct 31 21:03:00 2018
23  Tue Oct 30 18:28:00 2018
31  Wed Oct 31 13:58:00 2018
19  Tue Oct 30 15:43:00 2018
21  Tue Oct 30 18:27:00 2018

コマンドの置き換えでこの問題を解決しました。

$ atrm $(echo "$(atq | awk '{print $1}')")

パイプラインが期待どおりに機能しないのはなぜですかatrm

ベストアンサー1

これはあなたの問題に非常に似ています。」指定された日付でキューからジョブを削除する「今を除いて、すべてのジョブを削除しようとしています。

削除するみんなatキューに保留中のジョブは以下を使用します。

atrm -a

-aこれが有効なオプションではないシステムでは、atrm以下を使用してください。

atq | awk '{ print $1 }' | xargs atrm

awkパイプラインの中央にある小さなスクリプトは、at出力の最初の列(ジョブID)を印刷し、atqそれを引数として使用して実行されますxargsatrm

これは次のようなものです。他の質問に対する私の答えprint $1無条件に施行されるという点だけを除いて。


理由

atq | awk '{ print $1 }' | atrm

うまくいかないのは、atrmジョブIDを標準入力から読み取らないからです。コマンドラインにIDが必要です。

「修正」は、2つのネストされたコマンド置換を使用することです。

atrm $( echo "$( atq | awk '{ print $1 }' )" )

これは、単一のコマンド置換を使用することで削減できます(echo $(...)この場合、置換でコマンドを実行するのと同じ、何もありませんecho)。

atrm $( atq | awk '{ print $1 }' )

おすすめ記事