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


73

다른 사람이 쓴 bash 스크립트를보고 있습니다 mktemp.

TEMP=`mktemp --directory`

그러나이 줄은 내 컴퓨터에서 작동하지 않습니다 (OS X 10.6).

이 회선이 크로스 유닉스 * x와 유사한 플랫폼과 호환되도록 어떻게 수정합니까? 편집 : 다른 명령으로도 충분합니다.

답변:


109

다음은 내가 하드 코딩하지 않고, 안정적으로 리눅스와 다윈 (맥 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에서 사용된다.


12
정말 멋진. 때때로 OS X의 다른 행동은 성가시다.
therealmarv

6
@therealmarv 항상 말하고 싶습니다.
Nikita Volkov

10
방금 mktemp -dOS X 10.11.5 El Capitan에서 실행 되었으며 예상대로 작동했습니다. file $(mktemp -d): /var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
Heath Borders

2
네. 이 Just Worked ™라는 사실에 놀랐습니다.
히스 국경

1
또한 from에서 mktemp -d -t 'mytmpdir'테스트 한 Linux에서 실행하면 예상대로 작동합니다. mktempcoreutils 8.26

15

템플릿을 제공해야합니다. mktemp -d /tmp/foo.XXXX작동해야합니다. 나는 본 적이 없다 --directory. 이것은 --그것이 GNU 확장 이라는 것을 암시합니다.


6
사용 $TMPDIR가능한 경우 사용하려면을 수행하십시오 mktemp -d "${TMPDIR:-/tmp}"/foo.XXXX. 그것은 Mac의 bash와 Debian의 대시에서 작동하므로 휴대용으로 보입니다.
Tom Anderson

9

변경 --directory-d. 전자는 GNU-ism이지만 mktempcoreutils의 GNU 도 지원합니다 -d. mktempOS X에서는 BSD에서와 같은, 그래서 -d실제로 제공 시스템간에 매우 휴대용해야한다 mktemp프로그램을.


방금 시도했지만 mktemp -d작동하지 않습니다.
mindeavor.

1
카일은 완전한 답을 가지고 있습니다. mktempOS X에 대한 템플릿을 필요로한다. 사용중인 스크립트는 GNU 규칙을 가정하며 기본 규칙이 제공되지 않으면 기본 템플릿을 사용합니다.
James Sneeringer

문제는 XXXXXOS X이 호환 가능한 템플릿 플래그가 있는지 확실하지 않은 템플릿에 유닉스 가 제공 될 것으로 예상 된다는 것입니다.
user3467349

2
mktempOS X 10.11.5에서 El Capitan이 나를 위해 일합니다 : file $(mktemp -d):/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
Heath Borders

4
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)"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.