
반환하는 데 시간이 걸리는 명령을 실행하고 실행 후 다른 명령을 실행하려고 하지만 이를 미리 계획하지 않았다고 가정해 보겠습니다.
Ctrl + Z를 누른 다음 제출할 수 있는 옵션이 있다는 것을 알고 있습니다 fg && otherCommand
. 그러나 여기에는 두 가지 주요 결함이 있습니다.
command1 && command2
첫 번째 명령이 다른 명령( 또는 ) 으로 구성된 경우command1; command2
첫 번째 제출된 줄의 후속 명령이 실행되지 않기 때문에 작동하지 않습니다.- 다음 명령을 입력하는 동안 첫 번째 명령의 실행이 중지됩니다. 그 불쾌한 30초 명령의 경우, 다음 명령을 입력하는 데 소비한 시간이 나머지 실행 시간의 전부는 아니더라도 상당 부분을 차지합니다.
또한 하나의 명령이 실행되는 동안 다음 명령을 입력한 다음 Enter이를 눌러 제출할 수 있다는 것도 알고 있습니다. 그러나 여기에는 두 가지 주요 결함도 있습니다.
- 처음 실행하는 명령이 에서 읽는 경우에는 작동하지 않습니다
stdin
. - 처음 실행한 명령이 출력을 생성하는 경우 입력한 내용을 볼 수 없습니다.
하나의 명령이 실행되는 동안 특수 터미널 에뮬레이터나 여러 터미널을 사용하여 더 많은 명령을 대기열에 추가하는 빠른 방법이 있습니까?
답변1
Ctrl+를 누르고 Z즉시 실행합니다 bg
. 이로 인해 현재 명령이 백그라운드에서 계속 실행됩니다. 그런 다음 현재 일정 이후에 fg && otherCommand
일정을 예약하는 데 사용할 수 있습니다 .otherCommand
이를 더 쉽게 하기 위해 빈 명령줄에서 +를 누르면 실행되도록 셸에서 Ctrl+를 구성했습니다 . 보다Zbg
zsh에서 포그라운드 프로세스를 더 빨리 해제하려면 어떻게 해야 합니까?그리고명령줄 앱을 백그라운드로 직접 보내는 방법은 무엇입니까?; 최신 버전의 bash가 동일한 작업을 쉽게 수행할 수 있는지 확인하지 않았습니다.
답변2
명명된 파이프를 생성할 수 있습니다(이 작업은 한 번만 수행해야 함).
mkfifo ~/myfifo
그런 다음 터미널(터미널 A라고 부르겠습니다)에서 다음과 같이 말할 수 있습니다.
exec 10< ~/myfifo
파이프의 읽기 끝을 파일 설명자 10에 할당하려면 2 이상의 다른 숫자를 사용할 수 있습니다. 따라서 다른 명령에 필요할 경우 표준 입력, 출력 및 오류를 계속 사용할 수 있습니다.
그런 다음 다른 터미널(터미널 B라고 부르겠습니다)에서 다음과 같이 말할 수 있습니다.
cat - > ~/myfifo
터미널 A에 대한 연결을 완료한 다음 프롬프트를 반환합니다. 이 명령은 표준 입력에서 입력한 내용을 파이프에 기록합니다. 그런 다음 터미널 A에 다음을 입력할 수 있습니다.
while read -u10 -r LINE; do eval "$LINE"; done
따라서 터미널 B에 입력한 명령을 실행합니다. 이 read
명령은 파일 설명자 10에서 줄을 읽고 eval
. eval
변수 내보내기와 같은 쉘 명령을 실행할 수 있습니다.
터미널 A가 열려 있는 한 Ctrl+C를 사용하여 루프를 중단할 수 있으므로 명령을 다시 입력할 수 있으며 나중에 루프를 다시 시작하여 대기 중인 나머지 명령 실행을 시작할 수 있습니다.
exec 및 while 명령을 쉘스크립트에 넣을 수 있으므로 fg && yourscript
처음에 파이프 모드를 잊어버린 경우 Ctrl-Z를 사용하여 파이프 모드를 활성화할 수 있습니다.
답변3
답변4
편집하다:질문을 잘못 해석했지만 아래 기술은 bash 스크립트에서 명령을 실행할 때 사람들에게 여전히 유용할 수 있습니다(따라서 단일 PID를 갖습니다).
이것은 Linux에서 command1이 유용한 출력을 인쇄하고 완료되면 다른 셸에서 다른 프로세스를 시작하고 싶을 때 사용하는 것입니다(즉, command1을 백그라운드로 실행하고 싶지 않습니다).
tail --pid=$command1_pid -f /dev/null; command2
$command1_pid
완료를 기다리고 있는 프로세스의 PID는 어디에 있습니까?
(원래 여기에서 찾은 것 같습니다.https://stackoverflow.com/a/41613532/1676393. 유용한 기타 세부정보는 여기를 참조하세요. Darwin(macOS)에서 작동하는 버전 등)
단계별:
- Ctrl+ 로 command1 중지Z
- run 을 실행
ps
한 다음 command1에 해당하는 프로세스를 찾고 해당 PID를 찾습니다. - 그런 다음 을 입력하여 command1 프로세스를 다시 시작
fg
하고 새 셸에서 위 명령을 실행합니다.
이와 같이 command1이 이전 쉘에서 완료되면 command2는 새 쉘에서 시작됩니다.