임시 파일 용 쉘에서 고유 한 파일 이름을 얻는 한 가지 방법은 이중 달러 기호 ($$
)를 사용하는 것입니다. 이것은 수시로 변화하는 숫자를 생성하지만, 반복적으로 호출하면 동일한 숫자를 반환합니다. (해결책은 단지 시간을 사용하는 것입니다.) 이 실제로 무엇인지, 그리고 그것이 고유 한 파일 이름을 생성하는 방법으로 제안되는 이유가 궁금합니다.
답변
Bash에서 $$
은 프로세스 ID이므로 주석에 명시된 바와 같이 다양한 이유로 임시 파일 이름으로 사용하는 것이 안전하지 않습니다.
임시 파일 이름의 경우 mktemp
명령을 사용하십시오.
$$는 현재 프로세스의 ID입니다.
$$는 현재 쉘 프로세스의 PID입니다. 고유 한 파일 이름을 생성하는 것은 좋은 방법이 아닙니다.
bash 프로세스의 프로세스 ID입니다. 동시 프로세스에는 동일한 PID가 적용되지 않습니다.
UNIX와 유사한 운영 체제의 모든 프로세스는 (일시적으로) 고유 한 식별자 인 PID를가집니다. 동시에 실행되는 두 프로세스는 동일한 PID를 가질 수 없으며 $$는 스크립트를 실행하는 bash 인스턴스의 PID를 참조합니다.
이것은 대단히 이 아니며 결코 재사용되지 않는다는 점에서 고유 한 식별자입니다 (사실, PID는 계속 재사용됩니다). 다른 사람이 스크립트를 실행하면 자신의 스크립트가 실행되는 동안 다른 식별자를 얻게됩니다. 당신이 죽으면, PID는 재활용 될 수 있고, 다른 누군가는 당신의 스크립트를 실행하고, 동일한 PID를 얻고, 따라서 동일한 파일명을 얻을 수있다.
이와 같이 "$$은 다른 사람이 내 인스턴스가 여전히 실행중인 동일한 스크립트를 실행하면 다른 이름을 갖게되는 파일 이름을 제공합니다"라고 말하는 것이 정말로 제정신입니다.
$$는 스크립트가 실행중인 쉘의 프로세스 ID입니다. 자세한 내용은 sh 또는 bash의 man 페이지를 참조하십시오. 맨 페이지는 명령 줄 "man sh"을 사용하거나 웹에서 "shell man page"를 검색하여 찾을 수 있습니다
$$는 (는) 사용자의 PID입니다. 당신이 조심하고 아무도 정확히 같은 방식으로하지 않는 한 그것은 정말로 고유 한 파일 이름을 생성하지 않습니다.
일반적으로 당신은/tmp를/myprogramname $$ 같은 것을 만들 것
가이 휴식하는 많은 방법이있어, 당신은 위치에 작성하는 경우 다른 사람이 많은 너무 어렵지 않다에 쓸 수 있습니다 OS가 어떤 PID를 가지고 있을지 예측할 수 있습니다. 루트로 실행 중이고/tmp/yourprogname13395를/etc/passwd를 가리키는 심볼릭 링크로 생성한다고 가정하십시오.
이것은 셸 스크립트에서 수행하는 것은 나쁜 일입니다. 임시 파일을 무언가에 사용하려면 파일을 여는 (생성하는) "독점"플래그를 적어도 추가 할 수있는 더 나은 언어를 사용해야합니다. 그렇다면 당신은 뭔가 다른 것을 clobbering하지 않을 수 있습니다.
$$는 스크립트를 실행하는 쉘 인터프리터의 PID (프로세스 ID)입니다. 현재 시스템에서 실행중인 각 프로세스마다 다르지만, 시간이 지남에 따라 pid가 랩 어라운드하고 종료 한 후에 결국 동일한 pid를 가진 다른 프로세스가있게됩니다.너가 달리고있는 한, pid는 너에게 유일한 것이다.
위의 정의에서 스크립트에서 $$를 몇 번이나 사용하더라도 동일한 수를 반환한다는 것은 분명합니다.
예 : 매우 안정적이거나 안전 할 필요가없는 것들을 임시 파일로 /tmp/myscript.scratch.$$. 그것은 예를 들어, 사용, 스크립트의 끝에서 같은 임시 파일을 삭제하는 것이 좋습니다의, 트랩 명령
trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
$$
가 bash는 프로세스 ID (PID)입니다. $$
을 사용하면 대개 경쟁 조건이 생기고 쉘 스크립트가 공격자에 의해 전복 될 수 있으므로 나쁜 생각입니다. 예를 들어 안전하지 않은 임시 파일을 생성하고 보안 권고를 발행해야하는 모든 these people을 참조하십시오.
대신 mktemp
을 사용하십시오. Linux man page for mktemp은 우수합니다. 여기에 몇 가지 예제 코드가 있습니다 :
감사합니다. 'mktemp' 옵션'-t'는 이제 더 이상 사용되지 않습니다 (char' -'의 문제 때문에 생각합니다). ** 요즘에는'mktemp $ {tempfoo} .XXXXXX'를 사용하십시오 **. 나는 당신의 게시물을 업데이 트하는 자유를 가져 가라. – Sebastian
[backtick은 더 이상 사용되지 않습니다.] (http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html#tag_23_02_06_03), 대신'TMPFILE = $ (mktemp)'를 사용하십시오. –
두 번째 emk의 답을 나에게 보냅시다. "$"를 "고유"한 것으로 사용하지 마십시오. 파일의 경우, mktemp를 사용하십시오. 동일한 bash 스크립트 내의 다른 ID의 경우 은 합리적으로 고유성의 좋은 기회 일 경우 "$$$ (날짜 + % s % N)"을 사용하십시오.
-k
또한,이 명령을 통해 로그인 사용자 이름을 잡을 수 있습니다. 예 : 바로 위에 답변을 보면 사람들의
echo $(</proc/$$/login id). After that, you need to use getent command.
- 1. XAML에서 *의 의미는 무엇입니까
- 2. "for (;;)"의 의미는 무엇입니까?
- 3. CSS에서 +의 의미는 무엇입니까?
- 4. :: :: C++의 의미는 무엇입니까?
- 5. 캐럿 (^.)의 의미는 무엇입니까?
- 6. ?의 의미는 무엇입니까? 속성
- 7. PHP에서 @의 의미는 무엇입니까?
- 8. ∃의 의미는 무엇입니까?
- 9. WS- *의 의미는 무엇입니까?
- 10. 자바에서 % %의 의미는 무엇입니까?
- 11. SQL에서 #의 의미는 무엇입니까?
- 12. C에서 '=='의 의미는 무엇입니까?
- 13. Prolog에서 \ +의 의미는 무엇입니까?
- 14. Phing에서 **의 의미는 무엇입니까?
- 15. C에서`size_t`의`_t`의 의미는 무엇입니까?
- 16. ModelState에서 "_FORM"의 의미는 무엇입니까?
- 17. jquery에서 "$ .something"의 의미는 무엇입니까?
- 18. 오라클 출력에서 '-'의 의미는 무엇입니까?
- 19. "캐시 쓰기"의 의미는 무엇입니까?
- 20. "고정 형식"의 의미는 무엇입니까?
- 21. ON [PRIMARY]의 의미는 무엇입니까?
- 22. 정규식에서^및 $의 의미는 무엇입니까?
- 23. WISC (스택)의 의미는 무엇입니까?
- 24. JavaScript에서 (file.is_image)의 의미는 무엇입니까?
- 25. Informix : 점 (.)의 의미는 무엇입니까?
- 26. C++에서 ~의 의미는 무엇입니까?
- 27. "마진 붕괴"의 의미는 무엇입니까?
- 28. 파이썬 : 배열 ([...])의 의미는 무엇입니까?
- 29. "위젯 크기"의 의미는 무엇입니까?
- 30. ASP.NET에서 "배포"의 의미는 무엇입니까?
는 $$ 공개적으로 쓰기 가능한 디렉토리에 쓰기 (예를 들어,/tmp를) 경우에도 하나의 파일에 대해 잘되지 않습니다. 심볼릭 링크로 쓰레기를 버리면 스크립트가 어딘가에 쓸 수 있습니다. mktemp가 훨씬 좋습니다. –
예, $$을 (를) 사용하면 심한 보안 허점이 생깁니다. 하지 마. – emk
충분한 인원이있는 사람이 답을 수정해야합니다 ... – dwestbrook