Perintah mktemp Linux: file sementara, TMPDIR, dan pembersihan

GNU mktemp membuat file atau direktori sementara dengan nama sulit ditebak, lalu mencetak jalur yang benar-benar dibuat. Simpan jalur itu, hentikan skrip jika pembuatan gagal, dan gunakan trap untuk membersihkan objek ketika skrip selesai; nama hasil -u belum dipesan atau dibuat.

Contoh-contoh menggunakan perilaku GNU Coreutils. Periksa mktemp --help, man mktemp, dan dokumentasi distribusi Anda ketika portabilitas atau opsi spesifik versi menjadi penting.

Apa itu perintah mktemp?

Pemilihan nama dan pembuatan objek dilakukan sebagai satu operasi yang menolak benturan nama. Ini mengurangi kondisi balapan (race condition), yaitu proses lain mengambil nama sebelum skrip menggunakannya. Nama berbasis ID proses saja mudah ditebak dan tidak memberi sifat tersebut. Perlindungan tetap memerlukan induk yang sesuai dan pengelolaan izin yang benar.

Sintaks Dasar

mktemp [OPSI]... [TEMPLAT]

Kutip jalur yang mengandung spasi. Saat didukung, letakkan -- sebelum operand yang dimulai dengan tanda hubung agar tidak ditafsirkan sebagai opsi.

Penggunaan dasar mktemp

Membuat file sementara

Pada GNU, tanpa templat, mktemp memakai pola tmp.XXXXXXXXXX dan memilih induk dari TMPDIR bila tersedia, atau /tmp bila tidak. Jalankan contoh secara terpisah atau simpan masing-masing sebagai skrip Bash; perintah exit keluar dari shell yang menjalankannya. File dibuat, bukan hanya namanya dicadangkan. Jika TMPDIR menunjuk induk yang tidak tersedia atau tidak dapat dipakai, pembuatan dapat gagal; jangan menganggap perintah otomatis memilih lokasi lain.

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

Hasilnya adalah jalur file yang berbeda pada setiap pembuatan berhasil. Di Linux, mode awal file memberi pemilik hak baca dan tulis tanpa akses grup/pengguna lain (0600), dan masker izin pembuatan (umask) yang lebih ketat dapat membatasinya lagi. Contoh dasar belum menghapus file; periksa objek yang dibuat dan gunakan pola pembersihan di bawah.

Memilih pola nama file

Komponen terakhir templat GNU memerlukan sedikitnya tiga X berurutan. Rangkaian X terakhir diganti dengan karakter pembeda. Akhiran dapat ditempelkan pada templat atau diberikan lewat --suffix; bila opsi itu dipakai, templat harus berakhir dengan X dan akhiran tidak boleh memuat garis miring.

mktemp report-XXXXXXXX.csv
mktemp --suffix=.log app-XXXXXXXX

Kedua perintah membuat dua file terpisah, misalnya bernama report-….csv dan app-….log; karakter pengganti sebenarnya berubah. Karena templat relatif diberikan tanpa -p atau --tmpdir, file berada di direktori kerja saat ini, bukan otomatis di TMPDIR. Simpan keluaran setiap perintah jika nanti perlu membersihkannya.

Membuat direktori sementara

Opsi -d membuat direktori kerja sementara. Di Linux, pemilik mendapat hak baca, tulis, dan masuk direktori (0700) tanpa akses grup/pengguna lain, kecuali dibatasi lagi oleh umask. Direktori induknya harus tersedia; objek baru ini dapat dipakai untuk beberapa berkas perantara.

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

Memeriksa jalur yang benar-benar dibuat

Gunakan keluaran perintah, bukan nama yang ditebak. Contoh berikut memeriksa tipe objek yang baru dibuat; kegagalan pembuatan menghentikan shell sebelum variabel dipakai.

tmpfile=$(mktemp) || exit 1
printf '%s\n' "$tmpfile" &&
test -f "$tmpfile"
printf '%s\n' "$?"

Dengan jalur biasa yang tidak mengandung baris baru, keluaran berupa jalur lalu 0. Status itu menunjukkan pencetakan dan pemeriksaan file berhasil setelah pembuatan, bukan bukti file akan dihapus otomatis. Jangan mengganti nama atau menimpa nilai variabel sebelum pembersihan, dan selalu kutip jalurnya, termasuk bila induk mengandung spasi.

Opsi utama

Opsi Tujuan
-d Membuat direktori alih-alih file.
-p DIR Menggunakan templat relatif terhadap direktori yang dipilih.
--tmpdir Gunakan TMPDIR atau direktori sementara default ketika tidak ada argumen yang diberikan.
--suffix=SUFFIX Tambahkan akhiran tanpa garis miring.
-q Menekan diagnostik sambil mempertahankan status kegagalan.
-u Hanya mencetak nama tanpa membuat objek; jangan dipakai untuk membuat file aman pada langkah terpisah.

Perilaku templat dan opsi dapat berbeda pada implementasi non-GNU, jadi periksa versi target. -p DIR atau --tmpdir=DIR memilih induk secara eksplisit dan mengharuskan templat relatif. --tmpdir tanpa argumen memilih TMPDIR atau /tmp. Induk dan direktori perantara tidak dibuat otomatis.

Contoh praktis

Membersihkan file sementara dengan trap

Contoh Bash lengkap berikut mendaftarkan pembersihan segera setelah pembuatan berhasil. readonly mencegah variabel tujuan tertimpa oleh penugasan berikutnya. Handler HUP, INT, dan TERM keluar dengan status tersendiri; pembersihan dilakukan oleh satu handler EXIT, sehingga sinyal tidak sekadar menghapus file lalu membiarkan pekerjaan berlanjut.

tmp_file=$(mktemp) || exit 1
readonly tmp_file
trap 'rm -f -- "$tmp_file"' EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM

printf '%s\n' 'data sementara' > "$tmp_file" &&
cat -- "$tmp_file"

Saat dijalankan sebagai skrip terpisah, keluaran yang diharapkan adalah data sementara, lalu file dibersihkan ketika shell berakhir. Di terminal interaktif, EXIT baru terjadi saat shell itu ditutup. trap tidak dapat menangani SIGKILL, hilangnya daya, atau semua jenis kerusakan; kegagalan pembersihan tetap perlu diperhatikan. Handler baru juga menggantikan handler lama untuk kondisi yang sama, sehingga contoh perlu diintegrasikan dengan handler aplikasi yang sudah ada.

Gunakan direktori kerja sementara

Untuk beberapa file perantara, gunakan satu direktori privat dan nama tetap hanya di dalamnya. Pastikan hasil mktemp -d memang berada di induk sementara yang dimaksud dan tidak menunjuk ke data lain sebelum memasang pembersihan rekursif. Contoh lengkap berikut mengubah huruf ASCII menjadi huruf besar.

work_dir=$(mktemp -d) || exit 1
readonly work_dir
trap 'rm -rf -- "$work_dir"' EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM

input="$work_dir/input"
output="$work_dir/output"
printf '%s\n' 'data sementara' > "$input" &&
tr '[:lower:]' '[:upper:]' < "$input" > "$output" &&
cat -- "$output"

Keluaran yang diharapkan adalah DATA SEMENTARA. Pada akhir skrip, direktori hasil pembuatan beserta berkas di dalamnya dihapus. Pola ini hanya untuk direktori privat yang baru dibuat oleh skrip tersebut; jangan memasukkan jalur yang diberikan pengguna, direktori induk, atau jalur proyek yang sudah ada ke variabel pembersihan ini.

Pilih direktori induk

Gunakan induk yang Anda kendalikan ketika data harus berada pada sistem berkas atau kebijakan penyimpanan tertentu. Contoh berikut membuat induk cache bila belum ada, lalu meminta file unik di dalamnya. mkdir -p tidak memperbaiki izin direktori lama, jadi periksa izin serta kepemilikan induk secara terpisah.

mkdir -p -- "$HOME/.cache/myapp" || exit 1
cache_file=$(mktemp -p "$HOME/.cache/myapp" cache-XXXXXXXX) || exit 1
printf '%s\n' "$cache_file"

File dibuat di bawah $HOME/.cache/myapp. Opsi -p yang diberikan secara eksplisit memilih induk itu, meskipun TMPDIR menunjuk tempat lain. Contoh hanya menunjukkan pemilihan lokasi; tambahkan pembersihan sesuai masa pakai cache. Menaruh file sementara pada sistem berkas yang sama dengan tujuan akhir dapat membantu prosedur rename, tetapi tidak membuat seluruh proses aplikasi menjadi satu transaksi.

mktemp dan perintah terkait

Perintah atau metode Peran utama Penggunaan yang sesuai
mktemp Buat nama dan objek unik secara atomik File sementara dan direktori yang aman
touch Buat nama file tetap yang dipilih Nama tetap pada lokasi yang dikendalikan
mkdir Buat nama direktori yang dipilih Jalur permanen atau yang sudah ditentukan
mktemp -u Cetak hanya nama yang saat ini tidak digunakan Tidak memberi reservasi nama untuk pembuatan berikutnya

Perhatian Penting

Jangan buat file nanti dari output mktemp -u

Nama hasil -u dapat diambil proses lain sebelum pemakaian. Jangan mencetak nama dengan mktemp -u lalu membuat file sendiri. Biarkan mktemp membuat objek dan pastikan status berhasil sebelum menulis ke jalurnya.

Kutip variabel pembersihan

Variabel kosong, penugasan ulang, atau pemisahan kata akibat kutipan yang hilang dapat mengarahkan pembersihan ke tempat salah. Kutipan mencegah pemisahan dan perluasan pola, tetapi bukan pengganti pemeriksaan jalur serta keberhasilan pembuatan. Periksa juga kepemilikan induk dan jangan menonaktifkan kesalahan pembuatan hanya dengan -q.

Ketahui di mana data sementara yang sensitif disimpan

Direktori sementara dapat berada pada disk, memori yang memakai swap, snapshot, atau cadangan. Izin privat tidak mengenkripsi isi dan penghapusan nama tidak menjamin sanitasi media. Pilih lokasi serta masa simpan sesuai kebutuhan data; lihat batas penimpaan file dan sanitasi penyimpanan bila menangani data yang perlu dimusnahkan.

FAQ

Mengapa mktemp lebih aman daripada menambahkan ID proses ke nama?

mktemp memilih nama sulit ditebak dan membuat objek sekaligus, sehingga mengurangi perebutan nama dan balapan tautan simbolik. Tetap gunakan induk yang sesuai dan jalur keluaran yang dikutip.

Bagaimana saya membuat direktori sementara?

Gunakan mktemp -d dan simpan jalur yang dicetak dalam variabel yang diapit tanda kutip.

Apakah file sementara dihapus secara otomatis?

mktemp sendiri tidak menjadwalkan penghapusan. Gunakan trap atau pengelolaan masa pakai lain; kebijakan pembersihan sistem tidak boleh diasumsikan akan berjalan pada waktu yang Anda butuhkan.

Kapan TMPDIR digunakan?

Pada GNU, templat yang dihilangkan atau --tmpdir tanpa argumen memakai TMPDIR jika tersedia, dengan /tmp sebagai cadangan. Templat relatif biasa tanpa opsi pemilihan induk dibuat di direktori kerja; -p DIR memilih induknya secara eksplisit.

Dokumentasi resmi

Referensi perintah Linux menurut tugas (bahasa Inggris) memberi konteks pengelolaan file lainnya.