나는 다음을 사용하는 다른 사람이 작성한 bash 스크립트를 보고 있습니다 mktemp
.
TEMP=`mktemp --directory`
하지만 이 줄은 내 컴퓨터(OS X 10.6)에서는 작동하지 않습니다.
*x와 유사하지 않은 플랫폼 간에 호환되도록 하려면 이 줄을 어떻게 수정해야 합니까?편집하다:대체 명령으로도 충분합니다.
답변1
하드코딩 없이 Linux 및 Darwin(Mac OS X 10.11 이전의 모든 버전)에서 작동하는 임시 디렉토리를 안정적으로 생성하기 위해 사용한 방법은 다음과 $TMPDIR
같습니다 /tmp
.
mytmpdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')
배경:
GNU mktemp 명령에는 인수가 필요하지 않습니다. Plain이 mktemp
작동하여 시스템의 임시 디렉토리에 임시 파일을 생성합니다.
Plain은 mktemp -d
Linux에서 원하는 파일 대신 디렉토리를 생성합니다.
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
tmp.XXXXXXXXXX
기본적으로 GNU mktemp는 하위 디렉터리(또는 파일) 이름의 템플릿을 사용합니다. 이 템플릿을 사용자 정의하려면 -t
이 옵션을 사용할 수 있습니다.
OSX의 mktemp에는 기본 템플릿이 없으므로 템플릿을 지정해야 합니다. 불행하게도 GNU mktemp는 템플릿을 -t
옵션으로 사용하는 반면 OSX에서는 위치 인수로 전달됩니다. 대조적으로, OSX의 mktemp에는 -t
또 다른 의미를 지닌 옵션이 있습니다. OSX의 옵션은 -t
템플릿의 "접두사"로 문서화되어 있습니다. 확장되어 {prefix}.XXXXXXXX
X가 자동으로 추가됩니다(예: 임시 디렉토리에 생성 가능 mktemp -d -t example
).example.zEJZWCTQ
$TMPDIR
많은 Linux 환경에서아니요기본 설정. 많은 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용입니다. 이 명령은 1
"usage: ..." 오류 상태 코드 응답과 함께 Darwin(Mac OS X)에서 실패합니다 . 이것이 우리가 stderr를 무시하고 Mac 변형을 수행하는 이유입니다. 이 mytmpdir
접두사는 Mac에서만 사용됩니다(이 옵션 설정 필요).
답변2
템플릿을 제공해야 합니다. mktemp -d /tmp/foo.XXXX
작동해야합니다. 나는 그런 것을 본 적이 없습니다 --directory
. 이는 --
GNU 확장임을 나타냅니다.
답변3
로 변경 . --directory
전자-d
는 GNU-ism이지만 mktemp
GNU는 coreutils도 지원합니다 -d
. OS X의 것과 mktemp
BSD의 것과 동일하므로 -d
프로그램이 실제로 배포되는 시스템 간의 이식성이 좋아야 합니다 mktemp
.
답변4
Linux 및 Mac OS의 디렉터리에 임시 폴더가 생성되도록 하기 위해 제가 찾은 /tmp
최고의 솔루션은 다음과 같습니다.mktemp -d '/tmp/mytmpdir.XXXXXX'
도움이 되길 바랍니다.