&&
;
대부분의 쉘은 어떤 방식으로든 명령 실행을 연결하는 기능을 제공합니다 . 그러나 명령이 이미 실행 중인 경우에도 첫 번째 명령의 결과에 따라 실행될 다른 명령을 추가할 수 있습니까?
도망쳤다고 했어
$ /bin/myprog
some output...
하지만 난 정말 그것을 원해요 /bin/myprog && /usr/bin/mycleanup
. myprog
너무 많은 시간이 낭비되기 때문에 모든 것을 종료하고 다시 시작할 수는 없습니다 . 나는 그것을 Ctrl+ 할 수 있고 / 필요하다면 . 이를 통해 다른 명령을 연결할 수 있습니까?Zfg
bg
나는 bash에 가장 관심이 있지만 모든 일반적인 쉘에 대한 답변을 환영합니다!
답변1
현재 있는 동일한 셸에서 다음 명령을 사용하여 이 작업을 수행할 수 있습니다 wait
.
$ sleep 30 &
[1] 17440
$ wait 17440 && echo hi
...30 seconds later...
[1]+ Done sleep 30
hi
Bash 매뉴얼 페이지에서
wait [n ...]
Wait for each specified process and return its termination status. Each n
may be a process ID or a job specification; if a job spec is given, all
processes in that job's pipeline are waited for. If n is not given, all
currently active child processes are waited for, and the return status is
zero. If n specifies a non-existent process or job, the return status is
127. Otherwise, the return status is the exit status of the last process
or job waited for.
답변2
fg
재개된 프로그램의 종료 코드를 반환하고 반환합니다. 따라서 를 사용하여 프로그램을 일시 중지한 ^Z다음 fg && ...
을 사용하여 다시 시작할 수 있습니다.
$ /bin/myprog
some output...
^Z
[1]+ Stopped /bin/myprog
$ fg && /usr/bin/mycleanup
답변3
요청한 내용이 가능한지 확실하지 않지만 프로그램을 시작한 셸이 아직 있는 경우 언제든지 $?
마지막 프로세스의 종료 상태를 확인할 수 있습니다.
$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi
답변4
작업이 포그라운드에 있는 경우 이러한 명령은 모두 예상한 것과 동일한 동작을 갖습니다.
[ $? -eq 0 ] && prog2
(( $? )) || prog2
참고: $?에는 실행 중인 프로그램이 종료될 때 반환 상태가 포함됩니다.
이는 처음에 명령을 입력하면 쉘이 수행할 작업을 명시적으로 나타냅니다.
prog1 && prog2
첫 번째 명령을 읽지 않고 stdin
포그라운드에서 실행 중인 경우 첫 번째 명령이 실행되는 동안 새 명령을 입력할 수 있습니다. 첫 번째 명령이 실행되면 쉘은 이를 읽고 실행합니다. 명령이 백그라운드에서 실행되는 경우 stdin
.
편집: 작업을 백그라운드에 두고 명령을 사용하는 것도 가능합니다 WAIT
. 백그라운드에서 다른 작업도 실행 중이라면 주의해야 합니다. 명령이 WAIT
대기된 작업의 상태를 반환하려면 작업 사양이 필요합니다 .