echo $$는 무엇을 합니까? [복사]

echo $$는 무엇을 합니까? [복사]

나는 이리저리 돌아다니며 echo비슷한 것을 시도하고 있습니다 echo ~. 대체 환경변수를 사용하려고 하다가 $실수로 echo $$. 놀랍게도 빈 줄 대신 6자리 숫자가 표시됩니다 269523. 같은 명령을 계속 시도하지만 숫자는 변경되지 않습니다. 그런데 몇 시간 뒤에 시도해보니 번호가 바뀌긴 했지만 여전히 6자리 숫자였습니다. 무슨 뜻인가요 echo $$? $환경 변수와 관련하여 특별한 의미를 갖는 다른 유사한 문자가 있습니까?

답변1

Bourne 및 csh 유사 쉘(and perl) 에서는 $쉘 인터프리터를 실행하는 프로세스의 ID로 확장되는 특수 인수입니다. $$이 매개변수의 값을 확장하는 데 사용되는 매개변수 확장 구문도 마찬가지입니다.

이 문자는 최소한 호출기의 검색 구문(보통 페이지가 매겨진 매뉴얼 페이지에 사용됨)의 특수 문자이고 $설명서의 모든 곳에서 찾을 수 있기 때문에 문서에서 찾기가 쉽지 않습니다.infoless$

zsh설명서 에서는 다음을 수행할 수 있습니다.Shell이 ​​설정한 매개변수부분( info -n 'Parameters Set By The Shell' zsh):

$
이 셸의 프로세스 ID입니다. 이는 zsh를 호출하여 시작된 원래 셸을 의미합니다. (...)로 시작된 하위 셸과 같이 새 프로그램을 실행하지 않는 셸에서 분기된 모든 프로세스는 동일한 값으로 대체됩니다.

배쉬 매뉴얼에서,특수 매개변수부분:

'$'
( $$)는 쉘의 프로세스 ID로 확장됩니다. "()" 하위 셸에서는 하위 셸이 아닌 호출 셸의 프로세스 ID로 확장됩니다.

zsh 및 bash 매뉴얼에는 모두 색인 항목(대부분의 특수 변수 및 매개변수 포함)이 있으므로 다음을 통해 액세스할 수 있습니다.

info zsh '$'
info bash '$'

echo둘 다 지적했듯이 명령을 해석(또는 실행 ) echo $$한 쉘 프로세스의 pid가 반드시 필요한 것은 아닙니다 . 이렇게 하려면 BASHPIDbash 및 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$bashzsh

이 매개변수는 POSIX 표준에 정의되어 있습니다(참조:특수 매개변수) 처럼

$
호출 쉘의 10진수 프로세스 ID로 확장됩니다. 서브셸에서(참조쉘 실행 환경), $현재 쉘과 동일한 값으로 확장되어야 합니다.

echo "$$"두 번째 명령이 서브쉘에서 실행 되어 (echo "$$")동일한 PID를 출력 하더라도 bash쉘은 BASHPID서브쉘에서 업데이트되는 이 변수를 도입합니다. 이것은 환경 변수도 아닙니다.

위의 참고 자료에는 문의할 수 있는 8가지 특수 매개변수도 나열되어 있습니다. 아래 내용은 제가 직접 작성한 내용이므로, 보다 구체적인 설명은 사용하고 있는 특정 쉘의 표준이나 매뉴얼을 확인하시기 바랍니다.

  • @: "$@"위치 인수 목록입니다(보통 현재 스크립트나 함수에 대한 명령줄 인수).
  • *:는 "$*"첫 번째 문자(일반적으로 공백)를 구분 기호로 사용하여 위치 인수가 $IFS연결된 단일 문자열입니다.
  • #: "$#"위치 매개변수의 개수입니다.
  • ?: "$?"가장 최근에 실행된 명령의 종료 상태입니다.
  • -: "$-"현재 설정된 쉘 옵션을 포함하는 문자열입니다.
  • $: "$$"위에서 언급한 대로(현재 쉘의 PID)
  • !: "$!"가장 최근에 시작된 비동기 작업("백그라운드 프로세스")의 PID입니다.
  • 0: "$0"현재 쉘 또는 쉘 스크립트의 이름입니다. 이는 진단 메시지에 사용됩니다.

답변3

이것은 pid현재의 것 입니다 shell.

$ tr '\0' '\n' < /proc/$$/cmdline
bash

관련 정보