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에서 작업하세요.)