실행 중인 `cmd1 && cmd2 && cmd3 && ...` 체인의 요소를 취소/교체하는 방법은 무엇입니까?

실행 중인 `cmd1 && cmd2 && cmd3 && ...` 체인의 요소를 취소/교체하는 방법은 무엇입니까?
$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+  Stopped
$ fg && command4 && wrong_command5 && command6
Running command3
Running command4

현재 실행이 종료된 후 일정을 취소하려면 어떻게 해야 합니까 wrong_command5?right_command5command4

답변1

command4현재 실행 중인 경우 매우 간단하게 이 작업을 수행할 수 있습니다.

^Z
$ fg && right_command5 && command6

이것은 본질적으로 command4처음부터 당신이 해온 일입니다. wrong_command5나머지는 교체되고 실행되지 않습니다.

나는 이 동작이 예상치 못한 것이라고 가정하므로 여기에서 무슨 일이 일어나고 있는지 알아보려면 계속 읽어보세요.


하지만: 참고하세요원래 명령 순서가 생각한 대로 수행되지 않았습니다.. 이 작업을 수행할 때:

$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+  Stopped
$ fg && command4

그러면 command2재개됩니다.하지만 체인의 나머지 부분은 그렇지 않습니다.. 중지는 (-20) 예외로 종료하는 것을 command2의미합니다 . 실패한 종료 로 인해 체인이 단락되어 작동하지 않습니다. 종료 후 즉시 재개됩니다 .Ctrl-ZSIGTSTPcommand2&&command3command4command2

&&다음을 교체하면 이 동작이 실제로 수행되는 것을 볼 수 있습니다 ||.

$ command2 || echo Running command3, exit was $?
^Z
[1]+  Stopped                 command2
Running command3, exit was 148
$

목표 동작을 달성하려면 복구 시 후속 명령 체인 전체를 나열해야 합니다. 또는 전체 명령 체인을 중지하고 재개할 수 있으려면 하위 쉘에서 명령을 실행해야 합니다.

$ (command1 && command2 && command3)
^Z
$ fg

하지만 이 경우에는 주문을 조정하고 교체할 수 있는 방법이 없습니다.

답변2

(이것은 문자 생략으로 인해 매우 다른 이전 버전의 질문에 대한 답변입니다. 두 번째 명령은 fg && command4 & wrong_command5 && command6원래 있었고 그것이 실제로 무엇을 의미하는지 밝혀졌습니다 fg && command4 && wrong_command5 && command6. 이것은 배경 명령으로 이전 질문에 대한 답변입니다. 새 명령을 참조하십시오. 질문 변형(기타 답변)


취소하려는 명령이 포그라운드에서 실행 중이며 다음 명령과도 "연결"되어 있습니다 &&. 정상적으로 실행 ^C되고 0이 아닌 상태로 종료되면 모든 것이 정상입니다.

예제를 단순화하기 위해 다음 줄을 분할하겠습니다.

$ fg && command4 & wrong_command5 && command6

동등한 줄로 바꾸십시오.

$ fg && command4 & 
$ wrong_command5 && command6

전경 프로그램을 종료해야 하며 wrong_command5이는 를 사용하여 쉽게 수행할 수 있습니다 ^C.
그런 다음 백그라운드 작업을 나열하여 기다리고 싶은 작업을 확인합니다. 작업 ID는 wait작업 종료를 대기하기 위해 기본 제공 명령과 함께 사용됩니다 . 교체 명령을 실행하기 위해 목록의 시작 부분으로
사용하고 , 그 뒤에 이전에 사용한 다음 명령을 사용합니다.wait

$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+  Stopped
$ fg && command4 & 
$ wrong_command5 && command6
^C
$ jobs
[1]  - running    command3
[2]  + running    command4
$ wait %2 && right_command5 && command6

wrong_command5키보드에서 신호를 받을 때 제대로 작동하지 않지만 다른 신호에서는 다음을 대신 ^C사용할 수 있습니다 .kill^C

$ fg && command4 & 
$ wrong_command5 && command6
[1] 14407
^Z
[2]  + 14408 suspended  wrong_command5
$ jobs
[1]  - running    command3
[2]  + running    command4
[3]    suspended  wrong_command5
$ kill %2
[2]  + 14408 terminated  wrong_command5
$ wait %2 && right_command5 && command6

관련 정보