$에서 프로세스 ID를 캡처할 수 없습니다! 배쉬 3.2.57에서

$에서 프로세스 ID를 캡처할 수 없습니다! 배쉬 3.2.57에서

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를 사용해 왔습니다 bash... 하지만 저는 백그라운드 프로세스의 프로세스 ID를 가져오기 위해 이 정확한 방법을 수행하는 많은 쉘 프로그램을 실행했으며 $!결코 중단된 적이 없다고 맹세합니다.

답변1

!다음의 트리거 문자입니다.역사 확장, 기본적으로 대화형 셸에서 활성화됩니다.

나는 그것이 pid=$!;귀하의 경우나 echo "$!". 오류 메시지에서 볼 수 있듯이 !foo검색 과 달리 빈 문자열을 사용하여 검색을 시도합니다 foo. 최신 버전의 Bash는 그 점에서 더 합리적 $!이거나 "!"트리거하지 않지만 3.2는 약간 어리석습니다.

작동하는 것으로 보이는 것은 pid=$! ;세미콜론 앞에 공백이 있는 것입니다. 아니면 그냥 히스토리 확장을 비활성화할 수도 있습니다 set +H. (참고하세요"$!" 그렇지 않다3.2에서 작업하세요.)

관련 정보