Bash에서 나머지 명령 목록을 어떻게 취소합니까?


10

Bash에서 때로는 명령 목록을 입력하고을 누르고 Enter나중에 목록 끝 부분에 일부 명령에 실수가 있음을 알게됩니다. Ctrl+를 누르면 C현재 실행중인 명령이 종료되고 나머지 목록은 취소됩니다. 현재 실행중인 명령 종료 하지 않고 나머지 목록을 취소 할 수있는 방법이 있습니까?

예를 들어, 다음과 같은 것을 입력했다고 가정 해 봅시다.

foo; bar

또는

foo && bar

where foo는 중단하지 않는 것이 매우 중요 bar하고 돌이킬 수없는 원치 않는 일 (예 : shutdown -h now또는 rm -rf /)을 수행하는 장기 실행 명령입니다 . 하지만 foo여전히 실행되고, 수 있도록 쉘을 말하는 일반적인 방법이 foo마무리하지만 실행하지 bar이후는? (그래, 난에 대한 사용 권한을 변경할 수 있습니다 bar그래서 실행 아니에요,하지만 경우에 특히 편리 아니라 bar같은 것입니다 rm내가 그동안 사용하고자하는 즉,도 내가 소유하지 않은 경우 작동합니다 bar또는 경우는 bar내장 명령이다.)


마지막 bar명령을 실행하기 전에 some_command:로 수정할 수 있습니다 ^bar^some_command.
GAD3R

3
@ GAD3R : 그러나 이것은 현재 행을 수정하지 않고 새로운 행을 시작합니다.
Arkadiusz Drabczyk

답변:


3

CtrlZ프로그램을 백그라운드 프로세스로 전환 하는 데 사용 하면 트릭이 발생합니다.

foo && bar

foo; bar필요한 방식으로 제어 할 수없는 의견으로 지적 한 @Arkadiusz Drabczyk에게 감사드립니다 .

그때:

^Z

[1]+  Stopped                 foo

이 명령은 첫 번째 작업 만 중지하고

fg %1

그러면 작업 만 foo포 그라운드로 가져오고 작업이 완료되고 종료됩니다.

추신 : 이것은 파일에 쓰는 두 개의 스크립트로 확인할 수 있습니다. 첫 번째는 몇 초 동안 잠을 자서 시간을 되돌릴 수 있습니다.

나는 왜 CtrlZ명령 만 실행 명령을 처리하고 나머지는 남겨 둡니다. 알고 싶어요.


1
재현 할 수 없습니다. 어떤 bash버전을 사용하십니까? 사용 GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)합니다. 다른 파일에 쓰는 2 개의 bash 스크립트를 작성했습니다 : write1.sh: pastebin.com/rbKmdWgBwrite2.sh: pastebin.com/bNx3VRws . 나는 그런 식으로 실행합니다 : ./write1.sh ; ./write2.sh. 첫 번째 스크립트 에코 wrote 1몇 번에, 나는 누르면 C-z는 말한다 [1]+ Stopped ./write1.sh: 나는 즉시 두 번째 스크립트의 출력을 볼 수 있습니다 wrote 2반복적으로 반향된다.
Arkadiusz Drabczyk

2
이 방법이 command1 && command2파이프 라인에서 작동하는 이유 는 프로세스에 신호를 Control-z보내는 SIGCHLD것입니다. 로 확인할 수 있습니다 echo $?. Bash그런 다음 첫 번째 프로세스가 성공적으로 완료되지 않고 다음 프로세스를 실행하지 않는 것을 확인합니다.
Arkadiusz Drabczyk

사용하고 GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)있습니다. 네, 당신 말이 맞아요 foo; bar원하는 방식으로 제어 할 수 없습니다. 그러나 Ctrl+Z명령 실행이 인 경우 두 번째 프로세스의 필수 중지를 수행 할 수 있습니다 foo && bar. 답변을 업데이트하겠습니다. 지적 해 주셔서 감사합니다.
Revanth Chetluru

@ArkadiuszDrabczyk는 Ctrl-Z가 SIGTSTP를 보내지 않습니까?
muru

@RevanthChetluru 참고 사항 bar은 여전히 ​​일시 중단되어 jobs출력으로 표시되므로 아마도 종료해야합니다.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.