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

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

$$실제로 무엇 이고 왜 고유 한 파일 이름을 생성하는 방법으로 제안 되는지 궁금합니다 .



답변

Bash $$는 프로세스 ID이며, 주석에서 언급했듯이 다양한 이유로 임시 파일 이름으로 사용하는 것이 안전하지 않습니다.

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


답변

$$bash의 프로세스 ID (PID)입니다. $$일반적으로 경쟁 조건을 만들고 공격자가 셸 스크립트를 전복시킬 수 있으므로 사용 하는 것은 좋지 않습니다. 예를 들어 안전하지 않은 임시 파일을 작성하고 보안 권고를 발행해야하는 모든 사람들 을 참조하십시오 .

대신을 사용하십시오 mktemp. mktemp는 리눅스 매뉴얼 페이지가 우수합니다. 예제 코드는 다음과 같습니다.

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


답변

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


답변

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

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

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


답변

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

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

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

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


답변

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


답변

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

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

예를 들어 /tmp/myscript.scratch.$$를 매우 안정적이거나 안전하지 않아도되는 것들에 대한 임시 파일로 사용할 수 있습니다. 예를 들어 trap 명령을 사용하여 스크립트 끝에서 이러한 임시 파일을 삭제하는 것이 좋습니다.

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