Saya menggunakan untuk membuat tempfile
, menghapusnya dan membuatnya kembali sebagai direktori:
tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"
Masalahnya adalah, proses lain mungkin mendapatkan nama yang sama X
, jika secara tidak sengaja mengeksekusi tempfile setelah satu proses rm -f X
dan tepat sebelumnya mkdir X
.
bash
temporary-directory
Xiè Jìléi
sumber
sumber
mktemp -d -t <prefix>
Untuk solusi yang lebih kuat saya menggunakan sesuatu seperti berikut ini. Dengan cara itu direktori temp akan selalu dihapus setelah skrip keluar.
Fungsi pembersihan dijalankan pada
EXIT
sinyal. Itu menjamin bahwa fungsi pembersihan selalu dipanggil, bahkan jika skrip dibatalkan di suatu tempat.Direktori skrip bash dari sini .
Bash traps .
sumber
cleanup
akan rm -rf direktori Anda saat ini!mktemp
gagal,WORK_DIR
akan kosong, artinya perintah hanya akanrm -rf
tanpa argumen. Saya tidak menggunakan FreeBSD tapi saya akan sangat terkejut jikarm -rf
itu setara denganrm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
dan kemudian 2rmdir /tmp/git/"${TMPWORKDIR}"
.. Jika variabelnya kosong sekarang, Anda masih akan kembali ke/tmp/git/
tidak ke keseluruhan sistem. Pertimbangkan sesuatu seperti ini dalam jawaban dan saya dengan senang hati akan setuju. ;)Satu-liner favorit saya untuk ini adalah
sumber
rm $(pwd)
? : Ppushd $(mktemp -d)
...popd
rm -r $(pwd)
rm -r $(pwd)
. Pertimbangkan kemungkinan bahwa pembuatan direktori sementara gagal karena alasan apa pun (mungkin sistem file / tmp penuh atau telah di-remount hanya karena kesalahan?); kemudiancd $(mktemp -d)
akan mengevaluasicd
perubahan mana ke direktori home pengguna, yang selanjutnya akan dihapus.if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
Cuplikan berikut secara aman akan membuat direktori sementara (
-d
) dan menyimpan namanya ke dalamTMPDIR
. (Contoh penggunaanTMPDIR
variabel ditunjukkan kemudian dalam kode di mana ia digunakan untuk menyimpan file asli yang mungkin akan dimodifikasi.)Baris pertama
trap
menjalankanexit 1
perintah ketika salah satu sinyal yang ditentukan diterima. Baris keduatrap
menghapus (membersihkan) jalan$TMPDIR
keluar program (normal dan abnormal). Kami menginisialisasi jebakan ini setelah kami memeriksa yangmkdir -d
berhasil menghindari secara tidak sengaja mengeksekusi jebakan keluar dengan$TMPDIR
kondisi tidak diketahui.sumber
-d
memeriksa direktori. 2.) Pengakhiran sudah merupakan default untuk sinyal-sinyal tersebut.