bash 3.2.57에서 $!의 프로세스 ID를 캡처할 수 없습니다.

bash 3.2.57에서 $!의 프로세스 ID를 캡처할 수 없습니다.

Bash 4.2.46이 설치된 원격 서버에서는 다음을 수행할 수 있습니다.

$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
[3] 7646
7646

그러나 bash 3.2.57이 설치된 Mac에서는 작동하지 않습니다.

$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
-bash: !: event not found

무슨 일이야? 어떻게든 저는 몇 년 동안 macOS를 사용해 왔고 전에는 이런 문제가 발생한 적이 없습니다...하지만 맹세컨데 저는 백그라운드 프로세스의 프로세스 ID를 얻는 bash정확한 방법을 수행하는 수많은 쉘 프로그램을 실행했으며 절대 그렇게 하지 않았습니다. $!부서지다.

답변1

!트리거 캐릭터 입니다역사적 확장, 대화형 셸에서 기본적으로 활성화됩니다.

귀하 의 pid=$!;경우 나 echo "$!".​ ​트리거할 것이지만 3.2는 이 점에 있어서는 약간 어리석습니다.!foofoo$!"!"

작동하는 것처럼 보이는 것은 pid=$! ;세미콜론 앞에 공백이 있다는 것입니다. 또는 기록 비활성화 확장을 사용할 수 있습니다 set +H. (알아채다"$!" 아니요3.2에서 작동합니다. )

관련 정보