한 줄의 bash 호출에서 PID 및 반환 코드 가져오기

한 줄의 bash 호출에서 PID 및 반환 코드 가져오기

sleep 10예를 들어 매우 긴 명령이 있다고 가정해 보세요 . paramikoPython(특히 ssh 라이브러리)을 사용하여 다른 서버에서 실행 하려고 합니다 .

명령을 시작하고, 명령의 PID를 인쇄한 다음, 완료될 때까지 기다리고, 마지막으로 명령의 종료 상태를 반환하는 한 줄 명령이 필요합니다.

내가 지금까지 시도한 것 :

bash -c "echo $BASHPID ; exec sleep 10" ; echo $?

이는 쉘의 PID를 인쇄한 다음 긴 명령에 대해 exec를 호출한 다음 기다렸다가 종료 상태를 인쇄합니다. 문제는 $BASHPID외부 bash 쉘의 PID를 인쇄하는 것입니다(아마도 호출이 bash -c cmd실제로 완전한 새 쉘을 생성하지 않는다는 것을 나타냄).

위의 명령을 세 줄로 호출하면 작동합니다.

bash
echo $BASHPID ; exec sleep 10
echo $?

서브 쉘을 사용하려는 시도는 나에게 효과가 없습니다.

echo $(echo $BASHPID ; exec sleep 10) ; echo $?

이것은 작동하지만 서브셸은 모든 출력을 echo로 파이프하고 echo는 모든 것을 즉시 인쇄합니다. 즉, $BASHPID절전 모드가 완료될 때까지 인쇄하지 않습니다. PID는 즉시 인쇄되어야 합니다.

답변1

예를 들어 실행하면 다음과 같습니다.

bash -c "echo $BASHPID; 절전 10 수행"

또는

echo$(echo$BASHPID; 절전 10 실행)

$BASHPID현재 쉘은 두 번째 bash(또는 하위 쉘)가 보기 전에 변수를 삽입하고 있습니다. 해결책은 현재 셸이 이러한 변수를 확장하지 못하도록 방지하는 것입니다.

bash -c 'echo $BASHPID ; exec sleep 10'

답변2

ssh이는 다른 쉘을 시작하지 않고 이미 실행한 쉘 명령입니다 (원격 사용자의 로그인 쉘로 해석됨). 쉘이 Bourne과 유사하거나 csh와 유사하다고 가정합니다.

echo "$$"; exec sleep 10

그 정도면 충분합니다. bash원격 호스트에는 설치가 필요 하지 않습니다 . ssh원격 명령의 종료 상태도 인쇄되지 않고 보고됩니다. 하지만 꼭 해야 한다면 다음과 같이 할 수 있습니다.

sleep 10 & echo "$!"; wait; echo "$?"

$?csh 와 같은 쉘에서는 작동하지 않습니다 $status.

원격 사용자의 로그인 셸이 Bourne의 로그인 셸과 유사하다고 보장할 수 없는 경우 다음을 수행할 수 있습니다.

exec sh -c 'sleep 10 & echo "$!"; wait; echo "$?"'

이 명령은 최소한 Bourne, csh 및 rc 시리즈 쉘과 호환되어야 합니다.

관련 정보