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


143

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

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

답변:


102

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

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


35
최상위 답변 만 보는 사람들의 경우 공개적으로 쓸 수있는 디렉토리 (예 : / tmp)에 쓸 경우 $$는 단일 파일로도 적합하지 않습니다. 스크립트가 바람직하지 않은 곳에 쓰도록하는 심볼릭 링크로 / tmp를 버리기 쉽습니다. mktemp가 훨씬 좋습니다.
Chris Jester-Young

4
예, $$를 사용하면 보안상의 문제가 발생합니다. 하지마
emk

7
또는 허용 답변으로 아래의 높은 평가 대답을 설정해야 질문을하는 사람 ...
jtimberman

6
SEO에 "달러"를 추가합니다.
Antoine

1
$$가 단지 pid를 출력한다면 어떻게 "안전하지 않을"수 있습니까? tmp 파일 이름에 PID를 사용하지 않는 열악한 디자인으로 인해 보안 허점이 생깁니다 ... tmp로가는 출력의 무결성에 관심이 있다면, 처음에 여기에 두지 말아야합니까? $$는 보안 허점,
예측력

113

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

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

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

3
감사. 이 mktemp옵션 -t은 더 이상 사용되지 않습니다 (char 문제로 생각합니다 -). 요즘 사용하십시오mktemp ${tempfoo}.XXXXXX . 귀하의 게시물을 업데이트 할 자유가 있습니다.
Sebastian

1
또한 노트는 것을 제발 역 따옴표가 사용되지 않습니다 , 그래서 사용하는 TMPFILE=$(mktemp)대신.
Michael Kopp 2016 년


7

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

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

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


5

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

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

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

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


3

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


3

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

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

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

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

2

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


2

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


2

두 번째 emk의 답변을 드리겠습니다. $$를 "고유 한"것으로 사용하지 마십시오. 파일의 경우 mktemp를 사용하십시오. 동일한 bash 스크립트 내에있는 다른 ID의 경우 "$$$ (date + % s % N)"을 사용하여 상당히 고유 한 가능성을 찾으십시오.

 -k

0

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

echo $(</proc/$$/login id). After that, you need to use getent command.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.