답변:
다음은 내가 하드 코딩하지 않고, 안정적으로 리눅스와 다윈 (맥 OS X 10.11 전에 모든 버전) 모두에서 작동하는 임시 디렉토리를 생성하여 결국 무엇 $TMPDIR
이나 /tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
GNU mktemp 명령에는 인수가 필요하지 않습니다. 일반 mktemp
이 작동하고 시스템의 임시 디렉토리에 임시 파일이 작성됩니다.
Plain mktemp -d
은 파일 대신 디렉토리를 생성하는데, 이는 Linux에서 사용하려는 것입니다.
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
기본적으로 GNU mktemp는 tmp.XXXXXXXXXX
하위 디렉토리 (또는 파일)의 이름으로 템플릿 을 사용합니다 . 이 템플릿을 사용자 정의하기 위해 -t
옵션을 사용할 수 있습니다.
OSX의 mktemp에는 기본 템플릿이 없으며 템플릿을 지정해야합니다. 불행히도 GNU mktemp가 템플릿을 -t
옵션으로 사용하는 경우 OSX에서는 위치 인수로 전달됩니다. 대신, OSX의 mktemp에는 -t
다른 것을 의미 하는 옵션이 있습니다. -t
OSX 의 옵션은 템플릿의 "접두사"로 문서화되어 있습니다. 로 확장되어 {prefix}.XXXXXXXX
X를 자동으로 추가합니다 (예 : temp 디렉토리에서 mktemp -d -t example
생성 example.zEJZWCTQ
).
나는 많은 리눅스 환경에서 찾을 놀랐다 $TMPDIR
되어 있지 기본적으로 설정합니다. 많은 CLI 프로그램이 설정 될 때이를 지원하지만 여전히 기본값이 필요합니다 /tmp
. 이는 $TMPDIR/example.XXXXXXXX
mktemp 또는 mkdir로 전달 하는 것이 로컬 디스크의 루트 디렉토리에서 생성 될 수 있기 때문에 위험하다는 것을 의미합니다 /example.XXXXXXXX
($ TMPDIR이 설정되지 않고 빈 문자열이 됨).
OSX에서 $TMPDIR
항상 설정하고 (적어도 기본 쉘에서)에 설정되지 않은 /tmp
(에 심볼릭 링크 인 /private/tmp
만에) /var/folders/dx/*****_*************/T
. 따라서 우리가 OSX를 위해 무엇을 하든지 기본 행동을 존중해야합니다.
결론적으로, 다음은 하드 코딩없이 또는 Linux 없이 Darwin (Mac OS X)에서 작동하는 임시 디렉토리 를 안정적으로 생성하는 데 사용한 결과입니다 .$TMPDIR
/tmp
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
첫 번째 부분은 Linux입니다. 이 명령은 Darus (Mac OS X) 1
에서 "usage : ..."로 응답하는 오류 상태 코드와 함께 실패합니다 . 그래서 우리는 stderr을 무시하고 대신 Mac 변형을 실행합니다. mytmpdir
접두사은 (해당 옵션을 설정해야합니다) Mac에서 사용된다.
mktemp -d
OS X 10.11.5 El Capitan에서 실행 되었으며 예상대로 작동했습니다. file $(mktemp -d)
: /var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
템플릿을 제공해야합니다. mktemp -d /tmp/foo.XXXX
작동해야합니다. 나는 본 적이 없다 --directory
. 이것은 --
그것이 GNU 확장 이라는 것을 암시합니다.
$TMPDIR
가능한 경우 사용하려면을 수행하십시오 mktemp -d "${TMPDIR:-/tmp}"/foo.XXXX
. 그것은 Mac의 bash와 Debian의 대시에서 작동하므로 휴대용으로 보입니다.
변경 --directory
에 -d
. 전자는 GNU-ism이지만 mktemp
coreutils의 GNU 도 지원합니다 -d
. mktemp
OS X에서는 BSD에서와 같은, 그래서 -d
실제로 제공 시스템간에 매우 휴대용해야한다 mktemp
프로그램을.
mktemp -d
작동하지 않습니다.
mktemp
OS X에 대한 템플릿을 필요로한다. 사용중인 스크립트는 GNU 규칙을 가정하며 기본 규칙이 제공되지 않으면 기본 템플릿을 사용합니다.
XXXXX
OS X이 호환 가능한 템플릿 플래그가 있는지 확실하지 않은 템플릿에 유닉스 가 제공 될 것으로 예상 된다는 것입니다.
mktemp
OS X 10.11.5에서 El Capitan이 나를 위해 일합니다 : file $(mktemp -d)
:/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX")"
mktemp
BSD ( OSX 포함 )의 경우 템플릿이 필요하지만 템플릿에 X
s를 허용합니다 .mktemp
Linux 용 (GNU) 에는 템플리트가 필요하지 않지만 템플리트가 지정된 경우 X
s 의 수는 6이어야합니다.그 참고 -t
를 위해 사용되지 않습니다 GNUmktemp
더 미래 지향적 코드가 될 수 있도록,
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX" 2>/dev/null || mktemp -q -d)"