답변:
다음은 내가 하드 코딩하지 않고, 안정적으로 리눅스와 다윈 (맥 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다른 것을 의미 하는 옵션이 있습니다. -tOSX 의 옵션은 템플릿의 "접두사"로 문서화되어 있습니다. 로 확장되어 {prefix}.XXXXXXXXX를 자동으로 추가합니다 (예 : temp 디렉토리에서 mktemp -d -t example생성 example.zEJZWCTQ).
나는 많은 리눅스 환경에서 찾을 놀랐다 $TMPDIR되어 있지 기본적으로 설정합니다. 많은 CLI 프로그램이 설정 될 때이를 지원하지만 여전히 기본값이 필요합니다 /tmp. 이는 $TMPDIR/example.XXXXXXXXmktemp 또는 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 -dOS 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이지만 mktempcoreutils의 GNU 도 지원합니다 -d. mktempOS X에서는 BSD에서와 같은, 그래서 -d실제로 제공 시스템간에 매우 휴대용해야한다 mktemp프로그램을.
mktemp -d작동하지 않습니다.
mktempOS X에 대한 템플릿을 필요로한다. 사용중인 스크립트는 GNU 규칙을 가정하며 기본 규칙이 제공되지 않으면 기본 템플릿을 사용합니다.
XXXXXOS X이 호환 가능한 템플릿 플래그가 있는지 확실하지 않은 템플릿에 유닉스 가 제공 될 것으로 예상 된다는 것입니다.
mktempOS 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")"
mktempBSD ( OSX 포함 )의 경우 템플릿이 필요하지만 템플릿에 Xs를 허용합니다 .mktempLinux 용 (GNU) 에는 템플리트가 필요하지 않지만 템플리트가 지정된 경우 Xs 의 수는 6이어야합니다.그 참고 -t를 위해 사용되지 않습니다 GNUmktemp 더 미래 지향적 코드가 될 수 있도록,
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX" 2>/dev/null || mktemp -q -d)"