使用管道的 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,并将以这些作为参数xargs运行。atrm

这几乎与我对你另一个问题的回答print $1除了无条件执行这一事实之外。


之所以

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

不起作用的原因是atrm没有从标准输入中读取作业 ID。它需要命令行上的 ID。

您的“修复”是使用两个嵌套命令替换:

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

这可以减少为仅使用单个命令替换(echo $(...)在本例中,与在替换中运行命令相同,没有echo),

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

相关内容