목차

, , , ,

mktemp

mktemp는 예측하기 어려운 이름으로 임시 파일이나 임시 디렉터리를 안전하게 생성하고 그 경로를 출력하는 command-line 도구다.

Summary

Installation

Debian / Ubuntu

mktemp는 GNU coreutils package에 포함된다.

sudo apt update
sudo apt install coreutils

RHEL / Fedora

sudo dnf install coreutils

macOS

macOS에는 BSD 계열 mktemp가 기본 제공된다. GNU 구현이 필요하면 Homebrew의 coreutils formula를 설치한다. macOS 기본 command와 충돌하는 GNU command에는 g prefix가 붙으므로 GNU 구현은 일반적으로 gmktemp로 실행한다.

brew install coreutils
gmktemp --version

Windows

GNU Coreutils가 공식 제공하는 native WinGet package는 없다. WSL을 사용하는 경우 해당 Linux distribution의 package manager로 coreutils를 설치한다.

설치 확인

GNU 구현은 다음 명령으로 version을 확인할 수 있다. BSD 구현은 –version을 지원하지 않을 수 있다.

mktemp --version

Usage

mktemp [OPTION]... [TEMPLATE]

Options

Examples

임시 파일 생성과 자동 정리

tmp_file=$(mktemp) || exit 1
trap 'rm -f -- "$tmp_file"' EXIT
 
printf '%s\n' 'temporary data' >"$tmp_file"
cat "$tmp_file"

변수 확장 결과에는 공백이 포함될 수 있으므로 경로 변수를 항상 quote한다.

현재 디렉터리에 template으로 생성

tmp_file=$(mktemp ./report.XXXXXX) || exit 1
printf '%s\n' "$tmp_file"

suffix가 있는 임시 파일 생성

다음은 GNU mktemp 예시다.

tmp_file=$(mktemp --suffix=.json app.XXXXXX) || exit 1
printf '{}\n' >"$tmp_file"

임시 디렉터리 생성과 자동 정리

tmp_dir=$(mktemp -d) || exit 1
trap 'rm -rf -- "$tmp_dir"' EXIT
 
printf '%s\n' 'work data' >"$tmp_dir/result.txt"
rm -rf 대상은 반드시 성공적으로 생성된 tmp_dir처럼 범위가 확정된 변수여야 한다. 빈 값이나 검증되지 않은 경로를 재귀 삭제 대상으로 사용하지 않는다.

TMPDIR 존중하기

GNU mktemp에서 template을 생략하면 TMPDIR을 우선한다.

mkdir -p -- "$PWD/.tmp"
tmp_file=$(TMPDIR="$PWD/.tmp" mktemp) || exit 1
printf '%s\n' "$tmp_file"

Troubleshooting

too few X's in template

GNU 구현에서는 template의 마지막 component에 연속된 X가 3개 이상 있어야 한다.

mktemp ./job.XXXXXX

생성 위치를 찾기 어려움

mktemp는 생성 경로를 stdout으로 반환한다. command substitution으로 저장하거나 바로 출력해 확인한다.

tmp_dir=$(mktemp -d) || exit 1
printf 'temporary directory: %s\n' "$tmp_dir"

permission denied

대상 디렉터리가 존재하고 현재 사용자가 쓸 수 있는지 확인한다. GNU 구현에서 -p DIR은 중간 디렉터리를 자동으로 만들지 않는다.

Compatibility

Deprecated / Legacy

Help

mktemp --help (GNU coreutils 8.30)

See Also

History