Berikut ini adalah apa yang akhirnya saya gunakan untuk secara andal membuat direktori sementara yang berfungsi pada Linux dan Darwin (semua versi sebelum Mac OS X 10.11), tanpa hardcoding $TMPDIRatau /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Latar Belakang:
Perintah mktemp GNU tidak membutuhkan argumen. Plain mktempakan bekerja dan membuat file sementara di direktori sementara sistem.
Plain mktemp -dakan membuat direktori alih-alih file, yang ingin Anda gunakan di Linux.
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
Secara default, mktemp GNU menggunakan templat tmp.XXXXXXXXXXuntuk nama sub direktori (atau file). Untuk menyesuaikan template ini, -topsi dapat digunakan.
Mktemp OSX tidak memiliki templat default dan mengharuskan templat ditentukan. Sayangnya, ketika GNU mktemp mengambil templat sebagai -topsi, pada OSX ini dilewatkan sebagai argumen posisi. Sebaliknya, mktemp OSX memiliki -topsi yang berarti sesuatu yang lain. The -tpilihan pada OSX didokumentasikan sebagai "awalan" untuk template. Ini diperluas ke {prefix}.XXXXXXXX, jadi itu menambahkan Xs ke secara otomatis (misalnya mktemp -d -t exampledapat membuat example.zEJZWCTQdi direktori temp).
Saya terkejut menemukan bahwa di banyak lingkungan Linux, $TMPDIRyang tidak diatur secara default. Banyak program CLI yang mendukungnya ketika diatur, tetapi masih membutuhkan default untuk itu /tmp. Ini berarti meneruskan $TMPDIR/example.XXXXXXXXke mktemp atau mkdir berbahaya karena dapat menghasilkan /example.XXXXXXXXdi direktori root disk lokal (karena $ TMPDIR tidak disetel dan menjadi string kosong).
Pada OSX, $TMPDIRselalu diatur dan (setidaknya di shell default) tidak diatur ke /tmp(yang merupakan symlink ke /private/tmp) tetapi ke /var/folders/dx/*****_*************/T. Jadi apa pun yang kita lakukan untuk OSX, harus menghormati perilaku default itu.
Sebagai kesimpulan, berikut ini adalah apa yang akhirnya saya gunakan untuk membuat direktori sementara yang berfungsi baik pada Linux dan Darwin (Mac OS X), tanpa hardcoding, salah satu $TMPDIRatau /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Bagian pertama adalah untuk Linux. Perintah ini akan gagal pada Darwin (Mac OS X) dengan kode status kesalahan 1merespons dengan "penggunaan: ...". Itu sebabnya kami mengabaikan stderr dan malah menjalankan varian Mac. The mytmpdirprefix hanya digunakan pada Mac (di mana opsi yang diperlukan untuk mengatur).