여러 플랫폼에서 올바른 tmp 디렉토리 찾기 임시 파일에 대한 올바른 기본 디렉토리를

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

스크립트는 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

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



답변

임시 파일을 처리하는 좀 더 이식 가능한 방법은 사용하는 것 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 사용자의 의견은 크게 감사하겠습니다.


답변

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

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

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


답변

당신은 할 수 있습니다 :

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

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

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

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