私はあちこちを歩き回り、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