![echo $$는 무엇을 합니까? [복사]](https://linux55.com/image/214721/echo%20%24%24%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9D%84%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
나는 이리저리 돌아다니며 echo
비슷한 것을 시도하고 있습니다 echo ~
. 대체 환경변수를 사용하려고 하다가 $
실수로 echo $$
. 놀랍게도 빈 줄 대신 6자리 숫자가 표시됩니다 269523
. 같은 명령을 계속 시도하지만 숫자는 변경되지 않습니다. 그런데 몇 시간 뒤에 시도해보니 번호가 바뀌긴 했지만 여전히 6자리 숫자였습니다. 무슨 뜻인가요 echo $$
? $
환경 변수와 관련하여 특별한 의미를 갖는 다른 유사한 문자가 있습니까?
답변1
Bourne 및 csh 유사 쉘(and perl
) 에서는 $
쉘 인터프리터를 실행하는 프로세스의 ID로 확장되는 특수 인수입니다. $$
이 매개변수의 값을 확장하는 데 사용되는 매개변수 확장 구문도 마찬가지입니다.
이 문자는 최소한 호출기의 검색 구문(보통 페이지가 매겨진 매뉴얼 페이지에 사용됨)의 특수 문자이고 $
설명서의 모든 곳에서 찾을 수 있기 때문에 문서에서 찾기가 쉽지 않습니다.info
less
$
zsh
설명서 에서는 다음을 수행할 수 있습니다.Shell이 설정한 매개변수부분( info -n 'Parameters Set By The Shell' zsh
):
$
이 셸의 프로세스 ID입니다. 이는 zsh를 호출하여 시작된 원래 셸을 의미합니다. (...)로 시작된 하위 셸과 같이 새 프로그램을 실행하지 않는 셸에서 분기된 모든 프로세스는 동일한 값으로 대체됩니다.
배쉬 매뉴얼에서,특수 매개변수부분:
'$'
($$
)는 쉘의 프로세스 ID로 확장됩니다. "()" 하위 셸에서는 하위 셸이 아닌 호출 셸의 프로세스 ID로 확장됩니다.
zsh 및 bash 매뉴얼에는 모두 색인 항목(대부분의 특수 변수 및 매개변수 포함)이 있으므로 다음을 통해 액세스할 수 있습니다.
info zsh '$'
info bash '$'
echo
둘 다 지적했듯이 명령을 해석(또는 실행 ) echo $$
한 쉘 프로세스의 pid가 반드시 필요한 것은 아닙니다 . 이렇게 하려면 BASHPID
bash 및 zsh $sysparam[pid]
의 특수 변수를 참조하세요.
zsh가 아닌 Bourne과 유사한 셸에서는 다음을 수행해야 합니다.
echo "$$"
따옴표가 없는 경우와 마찬가지로 echo $$
분할+글로브 연산자를 호출하는 특수 구문이 있지만 여기서는 필요하지 않습니다. 그러나 실제로 $IFS
는 숫자를 포함하는 경우에만 차이를 확인할 수 있습니다.
bash-5.0$ echo $$ "$$"
33664 33664
bash-5.0$ IFS=6
bash-5.0$ echo $$ "$$"
33 4 33664
답변2
이 매개변수(해당 값은 앞에 다른 접두사를 붙여 출력됨 $
)는 모든 POSIX 및 POSIX 유사 셸(예: 및 등)의 특수 매개변수(환경 변수가 아님)입니다. 현재 쉘의 프로세스 ID(PID)를 저장합니다.echo
$
bash
zsh
이 매개변수는 POSIX 표준에 정의되어 있습니다(참조:특수 매개변수) 처럼
$
호출 쉘의 10진수 프로세스 ID로 확장됩니다. 서브셸에서(참조쉘 실행 환경),$
현재 쉘과 동일한 값으로 확장되어야 합니다.
echo "$$"
두 번째 명령이 서브쉘에서 실행 되어 (echo "$$")
동일한 PID를 출력 하더라도 bash
쉘은 BASHPID
서브쉘에서 업데이트되는 이 변수를 도입합니다. 이것은 환경 변수도 아닙니다.
위의 참고 자료에는 문의할 수 있는 8가지 특수 매개변수도 나열되어 있습니다. 아래 내용은 제가 직접 작성한 내용이므로, 보다 구체적인 설명은 사용하고 있는 특정 쉘의 표준이나 매뉴얼을 확인하시기 바랍니다.
@
:"$@"
위치 인수 목록입니다(보통 현재 스크립트나 함수에 대한 명령줄 인수).*
:는"$*"
첫 번째 문자(일반적으로 공백)를 구분 기호로 사용하여 위치 인수가$IFS
연결된 단일 문자열입니다.#
:"$#"
위치 매개변수의 개수입니다.?
:"$?"
가장 최근에 실행된 명령의 종료 상태입니다.-
:"$-"
현재 설정된 쉘 옵션을 포함하는 문자열입니다.$
:"$$"
위에서 언급한 대로(현재 쉘의 PID)!
:"$!"
가장 최근에 시작된 비동기 작업("백그라운드 프로세스")의 PID입니다.0
:"$0"
현재 쉘 또는 쉘 스크립트의 이름입니다. 이는 진단 메시지에 사용됩니다.
답변3
이것은 pid
현재의 것 입니다 shell
.
$ tr '\0' '\n' < /proc/$$/cmdline
bash