다음을 사용하여 이전 명령의 pid를 얻으려고합니다 $!
.
$ echo "test" | echo $!
4436
$
서브셸을 시작하면 비어 있습니다.
$ bash
$ echo "test" | echo $!
$
다음을 사용하여 실행하면 -c
동일한 일이 발생합니다 .
$ bash -c 'echo "test" | echo $!'
$
다시 작성할 수 있거나 작동하도록 옵션을 추가할 수 있는 것이 있습니까 bash -c
?
답변1
$!
가장 최근에 시작된 백그라운드 작업( 로 끝나는 명령 &
)의 PID가 저장됩니다. 파이프라인의 다른 부분에 대한 정보를 얻기 위해 표시된 방식으로는 이를 사용할 수 없습니다.
파이프라인이 숫자를 출력한다는 사실은 echo "test" | echo $!
파이프라인을 실행하기 전 어느 시점에서 백그라운드 작업을 시작했다는 의미일 뿐입니다. 숫자 출력은 파이프의 어떤 것과도 관련이 없습니다. 새 셸에서는 백그라운드 작업이 시작되지 않으며 파이프는 아무것도 출력하지 않습니다.
답변2
$!
작업의 PID입니다이것쉘이 마침내 배경에 배치됩니다. 다른 백그라운드 프로세스를 실행하면 덮어쓰게 되므로 일반적으로 변수에 저장해야 합니다. 그 점에서는 $!
이렇지만 $?
, 그렇게 빨리 다루지는 않을 것입니다.
다른 변수와 마찬가지로 하위 프로세스에서 사용할 수 있도록 하려면 환경으로 내보냅니다.
background_command &
export background_command_pid=$!
…
bash -c 'echo "My background sibling process is $background_command_pid"'
그런데, 당신이 말하는 것과는 반대로,$!
예서브쉘에 저장됩니다.
$ sleep 3 & echo $!
23791
$ { echo $! | cat; }
23791
$ ( echo $!; /bin/cat /dev/null; ); /bin/cat /dev/null
23791
$ echo $! $(echo $!)
23791 23791
다른 bash 인스턴스를 실행하는 것은 하위 쉘이 아닙니다. 누구세요서브쉘을 쉘인 하위 프로세스와 혼동하기.