작업을 위해 임시 파일을 작성하고 자체 정리 해야하는 스크립트가 있습니다. 내 질문은 임시 파일에 대한 올바른 기본 디렉토리를 찾는 것입니다.
스크립트는 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))
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
경로 가 필요합니다 .