macOS의 mktemp는 $TMPDIR을 지원하지 않습니다.

macOS의 mktemp는 $TMPDIR을 지원하지 않습니다.

예전에 이 내용을 알고 있었는데 답변을 하다가 다시 언급되었습니다."디렉토리를 같은 이름의 디렉토리로 이동하는 방법은 무엇입니까?":

환경 변수와 관련하여 macOS의 유틸리티는 mktempLinux 또는 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를 변경하려는 경우가 아니면 변경할 수 없습니다.CT

애플리케이션이 를 호출하면 confstr(_CS_DARWIN_USER_TEMP_DIR,…)C 라이브러리는 먼저 사용자가사용자 로컬디렉토리를 확인하고사용자 지역 온도그 안에 디렉토리가 있습니다.

당신이 가지고 있는지 확인하십시오사용자 로컬디렉토리는 액세스할 수 없기 때문에 중요하지 않습니다 . 따라서 슈퍼유저 권한으로 실행되고 C 라이브러리 구현에서 애플리케이션의 Mach IPC 호출 에 응답하여 이러한 디렉토리를 안전하게 생성하는 Mach 시작 데몬이 /var/folders있습니다 . 너dirhelperconfstr()하다쓰기 권한이 있음사용자 로컬디렉터리(한 번 생성되면)이므로 C 라이브러리는 mkdir()해당 디렉터리의 직접적인 하위 항목일 뿐입니다(아직 존재하지 않는 경우).

성공하면 mktemp프로그램은 환경 변수의 값을 절대 확인하지 않습니다. 왜냐하면 TMPDIR코드의 폴백은 호출에서 호출로 진행되고 그 반대가 아니기 때문입니다. 거의 항상 작동합니다. 실패 모드는 시작 데몬이 실행되지 않거나 하위 디렉터리 생성 시도가 오류와 함께 실패하는 것입니다.mktempconfstr()getenv()confstr(_CS_DARWIN_USER_TEMP_DIR,…)dirhelperT밖의디렉터리가 이미 존재합니다.

디렉토리 외부에 컨텐츠를 넣을 수 있지만 T이는 시작 데몬에 의해 주기적으로 정리되므로 dirhelper디렉토리의 컨텐츠가 삭제됩니다 /var/folders. 시작 데몬을 비활성화하면 dirhelper자체 문제가 발생하며 그 중 가장 중요한 것은 /var/folders정리되지 않는다는 것입니다. 자신에 대한 쓰기 액세스를 거부합니다.사용자 로컬디렉토리는 모든 것을 방해할 수 있습니다다른그 목적은 단지 하위 디렉토리만을 위한 것이 아닙니다 T.

템플릿을 제공하는 것 외에 가장 좋은 옵션은 T심볼릭 링크를 생성하는 것이지만 동시에 임시 파일을 생성하려는 실행 중인 모든 애플리케이션에 영향을 미치기 때문에 여전히 좋지 않습니다.

변수 이름도 마찬가지입니다 DARWIN_USER_TEMP_DIR. 문자열을 구성하는 유틸리티 및 라이브러리 함수의 이름입니다 _CS_DARWIN_USER_TEMP_DIR.getconfconfstr()

관련 정보