Linux / 명령어 / mktemp - 안전한 임시 파일과 디렉터리 생성
mktemp는 예측하기 어려운 고유 이름으로 임시 파일이나 디렉터리를 원자적으로 생성하고 그 경로를 출력합니다. 프로세스 ID를 붙인 이름을 직접 만드는 방식보다 이름 충돌과 심볼릭 링크 경쟁 조건을 줄일 수 있습니다.
이 글에서는 템플릿 사용법, 임시 디렉터리 생성, TMPDIR와 위치 선택, 셸의 trap을 이용한 정리와 피해야 할 -u 사용법을 설명합니다.
mktemp 명령어란?
mktemp는 템플릿의 연속된 X를 임의 문자로 치환하고, 그 이름의 파일이나 디렉터리를 실제로 생성한 뒤 경로를 출력합니다. 템플릿을 지정하면 마지막 경로 구성 요소에 보통 3개 이상의 연속된 X가 필요합니다. 출력된 경로는 공백을 포함할 수 있으므로 항상 따옴표로 감싸 사용해야 합니다.
기본 문법
mktemp [옵션] [템플릿]
파일명이나 경로에 공백이 있으면 따옴표로 감싸고, 하이픈으로 시작하는 이름은 가능한 경우 -- 뒤에 지정합니다. 지원 옵션은 배포판과 GNU Coreutils 버전에 따라 다를 수 있으므로 mktemp --help와 man mktemp으로 현재 시스템의 설명을 확인하세요.
mktemp 기본 사용법
임시 파일 만들기
템플릿을 생략하면 시스템 임시 디렉터리 정책에 따라 고유 파일을 만들고 경로를 출력합니다.
tmp_file=$(mktemp) || exit 1 printf '%s\n' "$tmp_file"
이름 형식을 지정하기
마지막 연속된 X들이 고유 문자열로 바뀝니다. 확장자가 필요하면 템플릿 뒤에 붙이거나 --suffix를 사용합니다.
mktemp report-XXXXXXXX.csv mktemp --suffix=.log app-XXXXXXXX
임시 디렉터리 만들기
-d는 파일 대신 현재 사용자만 접근 가능한 임시 디렉터리를 만듭니다. 더 제한적인 umask는 권한을 추가로 줄일 수 있습니다.
tmp_dir=$(mktemp -d) || exit 1 printf '%s\n' "$tmp_dir"
실제 생성 경로 확인하기
mktemp는 안전하게 생성한 임시 파일의 경로를 표준 출력으로 돌려줍니다. 이름을 추측해 만들거나 -u 결과만 믿지 마세요.
tmpfile=$(mktemp) printf '%s\n' "$tmpfile" test -f "$tmpfile" echo $?
출력은 임시 경로 한 줄과 0입니다. 임시 경로의 문자열은 실행마다 다릅니다. 작업이 끝나면 정확히 생성한 파일인지 확인하고 따옴표로 감싼 변수 경로를 정리하세요.
주요 옵션
| 옵션 | 설명 |
|---|---|
-d, --directory |
임시 파일 대신 디렉터리를 만듭니다. |
-p DIR, --tmpdir=DIR |
템플릿을 지정한 디렉터리를 기준으로 사용합니다. |
--tmpdir |
인수 없이 사용하면 TMPDIR 또는 기본 임시 디렉터리를 사용합니다. |
--suffix=SUFFIX |
생성 이름 뒤에 접미사를 붙입니다. |
-q, --quiet |
생성 실패 진단을 숨기지만 종료 상태는 유지합니다. |
-u, --dry-run |
이름만 출력하고 만들지 않습니다. 경쟁 조건 때문에 보안 용도로 사용하면 안 됩니다. |
긴 옵션은 의미를 파악하기 쉽고 스크립트 검토에도 도움이 됩니다. 다만 이식성이 중요한 스크립트에서는 대상 시스템이 해당 GNU 확장 옵션을 지원하는지 먼저 확인하세요.
실전 활용 예제
trap으로 임시 파일 정리하기
생성 직후 종료 신호와 정상 종료에서 정리하도록 등록합니다. 변수는 따옴표로 감싸고 생성 실패 시 즉시 중단합니다.
tmp_file=$(mktemp) || exit 1 trap 'rm -f -- "$tmp_file"' EXIT HUP INT TERM printf '%s\n' 'temporary data' > "$tmp_file"
임시 작업 디렉터리 사용하기
여러 중간 파일이 필요하면 임시 디렉터리 하나를 만든 뒤 그 안에 고정된 이름을 사용하면 관리가 쉽습니다.
work_dir=$(mktemp -d) || exit 1 trap 'rm -rf -- "$work_dir"' EXIT HUP INT TERM input=$work_dir/input output=$work_dir/output
원하는 부모 디렉터리 선택하기
같은 파일 시스템에서 원자적 이름 변경이 필요하거나 공간·보안 정책이 다른 경우 -p로 위치를 지정합니다. 디렉터리는 미리 존재해야 합니다.
mkdir -p "$HOME/.cache/myapp" cache_file=$(mktemp -p "$HOME/.cache/myapp" cache-XXXXXXXX) || exit 1
mktemp와 관련 명령 비교
| 명령·방법 | 주요 역할 | 적합한 상황 |
|---|---|---|
mktemp |
고유 이름을 만들고 즉시 항목 생성 | 안전한 임시 파일·디렉터리 |
touch |
지정한 고정 이름의 파일 생성 | 충돌 위험이 없는 일반 파일 |
mkdir |
지정한 고정 이름의 디렉터리 생성 | 영구적이거나 미리 정한 경로 |
mktemp -u |
사용되지 않는 이름만 출력 | 보안 파일 생성에는 부적합 |
사용할 때 주의할 점
-u 결과로 파일을 만들지 않는다
이름을 출력한 뒤 실제 파일을 만드는 사이에 다른 프로세스가 같은 경로를 선점할 수 있습니다. 임시 파일은 -u 없이 mktemp가 직접 만들게 하세요.
정리 명령의 변수를 따옴표로 감싼다
빈 값이나 공백이 포함된 경로가 잘못 확장되면 엉뚱한 파일을 삭제할 수 있습니다. 생성 성공을 확인하고 rm -- "$변수"처럼 사용하세요.
민감한 데이터의 저장 위치를 확인한다
임시 디렉터리가 메모리 파일 시스템인지 디스크인지, 백업·스왑·스냅샷에 포함되는지는 시스템마다 다릅니다. 민감한 데이터 정책을 별도로 확인하세요.
FAQ
프로세스 ID를 붙인 임시 파일명보다 mktemp가 안전한 이유는 무엇인가요?
예측하기 어려운 이름을 선택하고 파일 생성까지 한 단계에서 수행해 이름 선점과 심볼릭 링크 경쟁 조건을 줄이기 때문입니다.
임시 디렉터리를 만들려면 어떻게 하나요?
mktemp -d를 사용하고 반환된 경로를 변수에 저장한 뒤 따옴표로 감싸 사용하세요.
생성한 임시 파일은 자동으로 삭제되나요?
일반적으로 자동 삭제되지 않습니다. 셸 스크립트에서는 trap으로 종료 시 정리하도록 등록하세요.
TMPDIR은 언제 사용되나요?
--tmpdir 사용이나 기본 템플릿 동작에서 임시 파일을 둘 위치를 선택하는 데 사용될 수 있습니다. 실제 동작은 설치된 버전의 도움말로 확인하세요.









