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

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

해당 작업에 대한 임시 파일을 만들고 자체적으로 정리해야 하는 스크립트가 있습니다. 내 질문은 임시 파일의 올바른 기본 디렉터리를 찾는 방법입니다.

이 스크립트는 Git Bash(Windows), Solaris, Linux, OSX 등 여러 플랫폼에서 실행되어야 합니다. 기본 임시 디렉터리는 플랫폼마다 다르게 표현됩니다.

  • Windows: ( %TMP%아마도 %TEMP%)
  • 운영 체제:$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

이건 너무 지루한 것 같아요. 더 좋은 방법이 있나요?

답변1

임시 파일을 처리하는 좀 더 이식성 있는 방법은 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 사용자의 피드백을 주시면 감사하겠습니다.

답변2

더 적은 수의 줄로 동일한 것을 찾고 있다면...

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

이것을 기사로 쓰시면 됩니다.

답변3

다음을 수행할 수 있습니다.

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

쉘은 4가지 대안 중 하나에서 실행 가능한 디렉토리를 찾거나 의미 있는 오류와 함께 종료되어야 합니다. 그럼에도 불구하고 POSIX는 $TMPDIR변수를 정의합니다.(XCU 시스템용):

TMPDIR이 변수는 임시 파일을 생성하기 위한 위치가 필요한 프로그램에서 사용할 수 있는 디렉터리의 경로 이름을 나타내야 합니다.

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

관련 정보