OS X의 mktemp에 대한 수정 또는 대안

OS X의 mktemp에 대한 수정 또는 대안

나는 다음을 사용하는 다른 사람이 작성한 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 -dLinux에서 원하는 파일 대신 디렉토리를 생성합니다.

(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}.XXXXXXXXX가 자동으로 추가됩니다(예: 임시 디렉토리에 생성 가능 mktemp -d -t example).example.zEJZWCTQ

$TMPDIR많은 Linux 환경에서아니요기본 설정. 많은 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용입니다. 이 명령은 1"usage: ..." 오류 상태 코드 응답과 함께 Darwin(Mac OS X)에서 실패합니다 . 이것이 우리가 stderr를 무시하고 Mac 변형을 수행하는 이유입니다. 이 mytmpdir접두사는 Mac에서만 사용됩니다(이 옵션 설정 필요).

답변2

템플릿을 제공해야 합니다. mktemp -d /tmp/foo.XXXX작동해야합니다. 나는 그런 것을 본 적이 없습니다 --directory. 이는 --GNU 확장임을 나타냅니다.

답변3

로 변경 . --directory전자-d 는 GNU-ism이지만 mktempGNU는 coreutils도 지원합니다 -d. OS X의 것과 mktempBSD의 것과 동일하므로 -d프로그램이 실제로 배포되는 시스템 간의 이식성이 좋아야 합니다 mktemp.

답변4

Linux 및 Mac OS의 디렉터리에 임시 폴더가 생성되도록 하기 위해 제가 찾은 /tmp최고의 솔루션은 다음과 같습니다.mktemp -d '/tmp/mytmpdir.XXXXXX'

도움이 되길 바랍니다.

관련 정보