여러 플랫폼에서 올바른 tmp 디렉토리 찾기


46

작업을 위해 임시 파일을 작성하고 자체 정리 해야하는 스크립트가 있습니다. 내 질문은 임시 파일에 대한 올바른 기본 디렉토리를 찾는 것입니다.

스크립트는 Git Bash (Windows), Solaris, Linux, OSX와 같은 여러 플랫폼에서 작동해야합니다. 각 플랫폼에서 선호하는 임시 디렉토리는 다르게 표현됩니다.

  • Windows : %TMP%(그리고 가능하면 %TEMP%)
  • OSX : $TMPDIR
  • Linux, UNIX : $TMPDIR시도했지만 여러 시스템에서 설정되지 않은 것으로 보입니다.

그래서 내 스크립트 에서이 상용구를 추가했습니다 :

if test -d "$TMPDIR"; then
    :
elif test -d "$TMP"; then
    TMPDIR=$TMP
elif test -d /var/tmp; then
    TMPDIR=/var/tmp
else
    TMPDIR=/tmp
fi

너무 지루한 것 같습니다. 더 좋은 방법이 있습니까?


6
${TMPDIR-/tmp}유닉스 계열에 사용하십시오 . 임시 파일 TMPDIR에 사용하지 않을시기를 알려주는 (시스템 또는 관리자 또는 사용자가) /tmp있습니다.
Stéphane Chazelas

답변:


72

임시 파일을 처리하는 좀 더 이식 가능한 방법은 사용하는 것 mktemp입니다. 임시 파일을 만들고 경로를 반환합니다. 예를 들어 :

$ mktemp
/tmp/tmp.zVNygt4o7P
$ ls /tmp/tmp.zVNygt4o7P
/tmp/tmp.zVNygt4o7P

스크립트에서 매우 쉽게 사용할 수 있습니다.

tmpfile=$(mktemp)
echo "Some temp. data..." > $tmpfile
rm $tmpfile

매뉴얼 페이지를 읽으면 필요에 따라 옵션을 설정할 수 있어야합니다. 예를 들어 :

  • -d 파일 대신 디렉토리를 만듭니다.
  • -u 이름을 생성하지만 아무 것도 생성하지 않습니다.

를 사용 -u하면 임시 디렉토리를 매우 쉽게 검색 할 수 있습니다 ...

$ tmpdir=$(dirname $(mktemp -u))

자세한 내용은 mktemp여기를 참조하십시오 .

Mac OS X 관련 편집 : Mac OSX 시스템을 사용한 적이 없지만 아래 Tyilo의 의견에 따르면 Mac OSX에서는 mktemp템플릿 (Linux의 선택적 인수) 을 제공해야합니다 . 인용 :

템플릿은 예를 들어 "X"가 몇 개 추가 된 파일 이름 일 수 있습니다 /tmp/temp.XXXX. 후행 "X"는 현재 프로세스 번호 및 / 또는 고유 한 문자 조합으로 대체됩니다. mktemp가 리턴 할 수있는 고유 파일 이름의 수는 제공된 "X"의 수에 따라 다릅니다. 6 개의 "X"는 mktemp가 56800235584 (62 ** 6) 중 가능한 파일 이름 중 하나를 선택하게합니다.

매뉴얼 페이지는 또한이 구현이에 대한 OpenBSD 매뉴얼 페이지에서 영감을 받았다고 말합니다 mktemp. 따라서 OpenBSD 및 FreeBSD 사용자들도 비슷한 차이를 볼 수 있습니다 ( 히스토리 섹션 참조).

아마, 아마 당신이 알다시피, 이것은 당신이 당신의 질문에서 찾고있는 임시 디렉토리를 포함하여 완전한 파일 경로를 지정해야합니다. 이 작은 문제는 -t스위치를 사용하여 처리 할 수 ​​있습니다 . 이 옵션은 인수를 (요구하는 것 같지만 prefix), 그이 나타납니다 mktemp에 의존 $TMPDIR필요한 경우.

대체로 다음을 사용하여 위와 동일한 결과를 얻을 수 있어야합니다 ...

$ tmpdir=$(dirname $(mktemp tmp.XXXXXXXXXX -ut))

이 솔루션을 직접 테스트 할 수 없기 때문에 Mac OS X 사용자의 의견은 크게 감사하겠습니다.


OP는 현재 삭제 된 의견으로이 문제를 해결했습니다. gitbash쉘 인터페이스 가 필요한 시스템에 대한 답변을 제공 할 수 없기 때문에 "약간" 걱정이 됩니다. Windows 시스템에서 임시 파일이 어디에 저장되어 있는지 알 수 없습니다.
John WH Smith

1
저것. 미쳤어 c:\User\Name\..............\stuff. 그리고 아마도 100 개가있을 것입니다. 여전히 일부 리눅스 배포판은에서 같은 수준의 광기에 접근하고 /var있습니다. 나는 단지 궁금했다. 내 경험에있어서 좌절감은 매우 이식성이 뛰어나고 편의성은 그다지 좋지 않았다. 어쨌든 아주 좋은 대답입니다.
mikeserv

1
1 년 정도 전에 저는 Win2K에서 WinXP를 통해 작동하는 Windows 복원 지점 파일을 조작하는 Bash 스크립트를 작성했습니다. 내 스크립트는 임시 파일의 기본 디렉토리 WINDOWS/Temp또는 Windows/Temp을 사용 합니다. 해당 디렉토리는 Windows 7 시스템에도 있습니다. 그러나 내 스크립트를 사용하면 사용자가 명령 줄에 대체 temp 디렉토리를 제공 할 수 있습니다.
PM 2Ring

에 템플릿을 제공해야하므로 OS X에서는 작동하지 않습니다 mktemp.
Tyilo

1
El Capitan부터 mktemp작동합니다. simple mktemp은 파일을 mktemp -d반환하고 디렉토리를 반환합니다. 템플릿이 필요하지 않습니다. 매뉴얼은 비록 업데이트되지 않습니다.
Franklin Yu

9

적은 수의 줄에서 같은 것을 찾고 있다면 ...

for TMPDIR in "$TMPDIR" "$TMP" /var/tmp /tmp
do
    test -d "$TMPDIR" && break
done

이것을 하나로 쓸 수 있습니다.


쓰기 가능 여부도 테스트해야합니다.
frostschutz

@janos : 다른 모든 방법이 실패하면 사용자에게 임시 파일의 경로를 제공하도록 요청하거나 명령 줄에서 하나를 지정하도록 허용하십시오.
PM 2Ring

6

당신은 할 수 있습니다 :

: "${TMPDIR:=${TMP:-$(CDPATH=/var:/; cd -P tmp)}}"
cd -- "${TMPDIR:?NO TEMP DIRECTORY FOUND!}" || exit

쉘은 4 가지 대안 중 하나에서 실행 디렉토리를 찾거나 의미있는 오류로 종료해야합니다. 여전히 POSIX는 $TMPDIR변수를 정의합니다 (XCU 시스템의 경우) .

TMPDIR 이 변수는 임시 파일을 만들 장소가 필요한 프로그램에 사용 가능한 디렉토리의 경로 이름을 나타냅니다.

또한 /tmp경로 가 필요합니다 .


1
이것이 바로 IMO의 정답입니다. 그것없이 투표와 함께 바닥에 앉아 무엇을하고 있는지 몰라 ...
그레엄

2
@ Graeme : 아마도 완전히 읽을 수 없기 때문일까요?
ssc

나는 올랐지 만 철회했다. 그렇다.이 답변은 엉망이다. 유용한 트랙에있는 것 같지만, 코드 스 니핏이 무엇을하려고하는지 전혀 명확하지 않다.-첫 번째 줄은 주석이고 두 번째 줄은 주석이다. 하나는 오류입니다 (어쨌든 bash에서). 약간의 작업을 사용할 수 있습니다.
Don Hatch

오, 나는 대답의 첫 번째 버전이 더 명확하다는 것을 알았습니다 (실제로 그것을 실행하려고하면 두 번째 줄에 오류가 있습니다) ... 그리고 일련의 편집이 코드 샘플을 완전히 지워서 이제 말도 안됩니다. 다른 패스를 사용할 수 있습니다 :-)
Don Hatch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.