실제로 대답하기보다는 강박적으로 이것저것 말만 삭제하지 말고 누가 대답해 주시면 정말 감사하겠습니다.
명령이 있어요
#/bin/sh
while :; \
do sleep 6h & wait $${!}; \
$$는 두 번째 프로세스인 SLEEP을 참조합니까? 그게 무슨 뜻이야 ${!}
? 구문을 잘 모르겠습니다. 즉 흐름은 이해하지만 $$ 기호가 두 개 있는 이유와 {!}의 용도를 정확히 알 수 없습니다.
내 질문을 삭제하기 전에 누구든지 제게 깨우쳐 주시면 매우 감사하겠습니다. 감사합니다.
답변1
공식 문서에는 다음과 같이 나와 있습니다.
($!) 비동기 명령으로 실행되거나 bg 내장 함수를 사용하여 가장 최근에 백그라운드에 삽입된 작업의 프로세스 ID로 확장됩니다(작업 제어 내장 함수 참조).
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameters
그리고 $${!}
모두 ${!!}
오류입니다.
게시된 대로 스크립트를 실행하면 다음 오류가 발생합니다.
./tst.sh: line 3: wait: `1234{!}': not a pid or valid job spec
여기서 1234는 셸 자체의 pid이며 $$
문자열 {!}
상수입니다.
구문상으로는 ${!!}
정확하지만 변수를 간접적으로 확장하려고 시도하며 !
이러한 변수는 실제로 존재할 수 없으므로 오류는 다음과 같습니다.${!!}: bad substitution
간접적인 설명은 다음과 같습니다. https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion
해당 코드가 있는 경우( 포함 $${!}
)실제로 작동한다. 그렇다면 이것은 쉘 스크립트가 아니라 다른 언어에 포함된 쉘 스크립트일 가능성이 높습니다. 변수를 표시하는 데에도 사용되는 것입니다 $
. 이러한 언어 대부분은 반복되는 달러 기호를 이스케이프 기호로 사용하므로 $$anything
호스트 언어가 이를 쉘 스크립트가 포함된 문자열로 완성한 후에는 가 됩니다.$anything