파이프를 사용하는 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 }' )

관련 정보