예전에 이 내용을 알고 있었는데 답변을 하다가 다시 언급되었습니다."디렉토리를 같은 이름의 디렉토리로 이동하는 방법은 무엇입니까?":
환경 변수와 관련하여 macOS의 유틸리티는 mktemp
Linux 또는 BSD(또는 최소한 OpenBSD)의 동일한 이름의 유틸리티와 다르게 작동합니다 TMPDIR
.
임시 파일을 생성하려면현재의목차는 보통 이렇게 말할 수 있어요
tmdfile=$(TMPDIR=. mktemp)
또는
tmpfile=$(TMPDIR=$PWD mktemp)
(이 있는 임시 디렉토리의 경우에도 유사함 mktemp -d
).
macOS에서는 다음과 같이 실제 템플릿을 제공하여 유틸리티가 현재 디렉터리를 사용하도록 강제해야 했습니다.
tmpfile=(mktemp ./tmp.XXXXXXXX)
사용하기가 더 편리하기 때문에 tmpfile=$(TMPDIR=. mktemp)
이 변수는 무시되고 비슷한 이름의 디렉터리에 파일이 생성됩니다 TMPDIR
./var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/T
macOS 설명서에는 다음이 mktemp
언급되어 있습니다.
-t prefix
이 옵션이 제공 되면 접두사 및 구성 변수(사용 가능한 경우)를mktemp
기반으로 템플릿 문자열이 생성됩니다 . 사용할 수 없는_CS_DARWIN_USER_TEMP_DIR
경우_CS_DARWIN_USER_TEMP_DIR
대체 위치는TMPDIR
및 입니다/tmp
.
내 시스템에서는 _CS_DARWIN_USER_TEMP_DIR
설정되지 않은 것 같습니다.
$ getconf _CS_DARWIN_USER_TEMP_DIR
getconf: no such configuration parameter `_CS_DARWIN_USER_TEMP_DIR'
하지만 예를 들면
tmpfile=$(TMPDIR=. mktemp -t hello)
여전히 아래에 파일을 생성합니다 /var/folders/.../
( $PWD
대신 사용하는 경우에도 마찬가지 .
).
나는 알아차렸다
$ getconf DARWIN_USER_TEMP_DIR
/var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/T/
하지만 이 값을 변경하는 방법을 모르기 때문에 이는 나에게 별로 도움이 되지 않습니다.
macOS mktemp
유틸리티는 FreeBSD에서 왔으며 OpenBSD에서 가져온 것이라고 합니다(오래 전이었을 것입니다).
질문:
이는 macOS 구현의 버그(또는 누락)입니까 mktemp
? 스크립트에서 DARWIN_USER_TEMP_DIR
값(또는 매뉴얼에 언급된 대로)을 어떻게 변경할 수 있습니까 _CS_DARWIN_USER_TEMP_DIR
(이상적으로는 값을 설정 해제하여 우선 순위를 갖도록 하고 싶습니다 $TMPDIR
)?
답변1
/var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/
이것이 당신의 다윈입니다사용자 로컬목차. 그 이름은 단순히 MacOS Concatenated Modified Base 32 Encoding입니다.사용자UUIDMacOS(BSD) 사용자 ID. 인코딩의 처음 두 글자는 디렉토리 크기를 작게 유지하기 위해 "버킷" 시스템으로 사용됩니다. 이 두 문자는 사용자 UUID의 처음 10자리를 인코딩합니다. 왜냐하면 Base 32에서 숫자는 물론 5자리이기 때문입니다.
하위 디렉토리는 귀하의 것입니다사용자 지역 온도그리고사용자 로컬 캐시목차. 이전 이름은 -Caches-
and 였지만 지금은 and -Tmp-
로 단축되었습니다 . 분명히 이러한 이름은 모두 고정되어 있으며 사용자 ID 또는 사용자 UUID를 변경하려는 경우가 아니면 변경할 수 없습니다.C
T
애플리케이션이 를 호출하면 confstr(_CS_DARWIN_USER_TEMP_DIR,…)
C 라이브러리는 먼저 사용자가사용자 로컬디렉토리를 확인하고사용자 지역 온도그 안에 디렉토리가 있습니다.
당신이 가지고 있는지 확인하십시오사용자 로컬디렉토리는 액세스할 수 없기 때문에 중요하지 않습니다 . 따라서 슈퍼유저 권한으로 실행되고 C 라이브러리 구현에서 애플리케이션의 Mach IPC 호출 에 응답하여 이러한 디렉토리를 안전하게 생성하는 Mach 시작 데몬이 /var/folders
있습니다 . 너dirhelper
confstr()
하다쓰기 권한이 있음사용자 로컬디렉터리(한 번 생성되면)이므로 C 라이브러리는 mkdir()
해당 디렉터리의 직접적인 하위 항목일 뿐입니다(아직 존재하지 않는 경우).
성공하면 mktemp
프로그램은 환경 변수의 값을 절대 확인하지 않습니다. 왜냐하면 TMPDIR
코드의 폴백은 호출에서 호출로 진행되고 그 반대가 아니기 때문입니다. 거의 항상 작동합니다. 실패 모드는 시작 데몬이 실행되지 않거나 하위 디렉터리 생성 시도가 오류와 함께 실패하는 것입니다.mktemp
confstr()
getenv()
confstr(_CS_DARWIN_USER_TEMP_DIR,…)
dirhelper
T
밖의디렉터리가 이미 존재합니다.
디렉토리 외부에 컨텐츠를 넣을 수 있지만 T
이는 시작 데몬에 의해 주기적으로 정리되므로 dirhelper
디렉토리의 컨텐츠가 삭제됩니다 /var/folders
. 시작 데몬을 비활성화하면 dirhelper
자체 문제가 발생하며 그 중 가장 중요한 것은 /var/folders
정리되지 않는다는 것입니다. 자신에 대한 쓰기 액세스를 거부합니다.사용자 로컬디렉토리는 모든 것을 방해할 수 있습니다다른그 목적은 단지 하위 디렉토리만을 위한 것이 아닙니다 T
.
템플릿을 제공하는 것 외에 가장 좋은 옵션은 T
심볼릭 링크를 생성하는 것이지만 동시에 임시 파일을 생성하려는 실행 중인 모든 애플리케이션에 영향을 미치기 때문에 여전히 좋지 않습니다.
변수 이름도 마찬가지입니다 DARWIN_USER_TEMP_DIR
. 문자열을 구성하는 유틸리티 및 라이브러리 함수의 이름입니다 _CS_DARWIN_USER_TEMP_DIR
.getconf
confstr()