it-swarm-ko.tech

쉘에서 $$는 무엇을 의미합니까?

한 번은 임시 파일의 쉘에서 고유 한 파일 이름을 얻는 한 가지 방법은 이중 달러 기호 ($$). 이것은 때때로 변하는 숫자를 생성하지만 반복해서 호출하면 같은 숫자를 반환합니다. 해결책은 시간을 사용하는 것입니다.

$$은 (는) 실제로 고유 한 파일 이름을 생성하는 방법으로 제안 된 이유입니다.

136
Kitty

배쉬에서 $$는 프로세스 ID이므로 주석에서 언급 한 것처럼 여러 가지 이유로 임시 파일 이름으로 사용하는 것이 안전하지 않습니다.

임시 파일 이름의 경우 mktemp 명령을 사용하십시오.

95
Joe Skora

$$는 bash의 프로세스 ID (PID)입니다. $$는 경쟁 조건을 만들고 공격자가 셸 스크립트를 무너 뜨릴 수 있기 때문에 나쁜 생각입니다. 예를 들어 안전하지 않은 임시 파일을 작성하고 보안 권고를 발행해야하는 모든 the people 을 참조하십시오.

대신 mktemp를 사용하십시오. mktemp에 대한 Linux 매뉴얼 페이지 가 우수합니다. 예제 코드는 다음과 같습니다.

tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
109
emk

$$는 현재 프로세스의 ID입니다.

18
Flint

운영 체제와 같은 UNIX의 모든 프로세스에는 고유 한 식별자 인 PID가 있습니다. 동시에 실행되는 두 프로세스는 동일한 PID를 가질 수 없으며 $$는 스크립트를 실행하는 bash 인스턴스의 PID를 나타냅니다.

이것은 재사용되지 않을 것이라는 점에서 매우 중요한 not 고유 식별자입니다 (실제로 PID는 지속적으로 재사용됩니다). 그것이 당신에게주는 것은 다른 사람이 당신의 스크립트를 실행하면, 당신이 여전히 실행중인 동안 다른 식별자를 얻을 수있는 숫자입니다. 일단 죽으면 PID가 재활용되고 다른 사람이 스크립트를 실행하고 동일한 PID를 얻으므로 동일한 파일 이름을 얻을 수 있습니다.

따라서 "$$는 파일 이름을 제공하여 다른 사람이 내 인스턴스가 계속 실행되는 동안 동일한 스크립트를 실행하는 경우 다른 이름을 얻습니다"라고 말하는 것은 정말 제정신입니다.

6
Adam Wright

$$는 PID입니다. 주의해서 다른 사람이 정확히 같은 방식으로 수행하지 않는 한 실제로는 고유 한 파일 이름을 생성하지 않습니다.

일반적으로/tmp/myprogramname $$와 같은 것을 만듭니다.

이 문제를 해결하는 방법에는 여러 가지가 있으며 다른 사람들이 쓸 수있는 위치에 글을 쓰는 경우 많은 OS에서 당신이 가지고있는 PID를 예측하고 조이는 것이 어렵지 않습니다. 루트로/etc/passwd를 가리키는 심볼릭 링크로/tmp/yourprogname13395를 만들고 여기에 씁니다.

이것은 셸 스크립트에서 나쁜 일입니다. 무언가를 위해 임시 파일을 사용하려면 최소한 파일을 열거 나 (작성) 위해 "배타적"플래그를 추가 할 수있는 더 나은 언어를 사용해야합니다. 그러면 다른 무언가를 방해하지 않을 수 있습니다.

4
JBB

두 번째 emk의 답변을 드리겠습니다. $$를 "고유 한"것으로 사용하지 마십시오. 파일의 경우 mktemp를 사용하십시오. 동일한 bash 스크립트 내의 다른 ID의 경우 합리적으로 고유성이 좋을 때 "$$$ (date + % s % N)"을 사용하십시오.

 -k
2
Kevin Little

$$는 현재 Shell 프로세스의 pid입니다. 고유 한 파일 이름을 생성하는 좋은 방법은 아닙니다.

2
leif

$$는 스크립트가 실행중인 Shell의 프로세스 ID입니다. 자세한 내용은 sh 또는 bash 매뉴얼 페이지를 참조하십시오. 맨 페이지는 명령 줄 "man sh"를 사용하거나 웹에서 "Shell 맨 페이지"를 검색하여 찾을 수 있습니다.

2
Shannon Nelson

Bash 프로세스의 프로세스 ID입니다. 동시 프로세스에는 동일한 PID가 없습니다.

1
Chris

$$는 스크립트를 실행하는 Shell 인터프리터의 pid (프로세스 ID)입니다. 현재 시스템에서 실행되는 각 프로세스마다 다르지만 시간이 지남에 따라 pid가 줄 바꿈되고 종료하면 결국 동일한 pid가있는 다른 프로세스가 있습니다. 실행중인 동안 pid는 나에게 고유합니다.

위의 정의에서 스크립트에서 $$를 몇 번 사용하더라도 동일한 숫자를 반환한다는 것이 분명합니다.

예를 들어 /tmp/myscript.scratch.$$는 매우 안정적이거나 안전 할 필요가없는 것들에 대한 임시 파일입니다. 예를 들어, trap 명령을 사용하여 스크립트 끝에서 이러한 임시 파일을 삭제하는 것이 좋습니다.

trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
1
Arkadiy

또한이 명령을 통해 로그인 사용자 이름을 가져올 수 있습니다. 예 :.

echo $(</proc/$$/login id). After that, you need to use getent command.
0
Obivan