Saat menjalankan skrip, saya ingin membuat file sementara di /tmp
direktori.
Setelah eksekusi skrip itu, itu akan dibersihkan oleh skrip itu.
Bagaimana cara melakukannya dalam skrip shell?
shell-script
tmp
Bhuvanesh
sumber
sumber
/proc
- Kecuali untuk sistem yang tidak memilikinya.exec 3> "$tmpfile"
dilakukan? Bukankah itu hanya berguna jika tmpfile adalah skrip yang berdiri sendiri?cat <&3
akan memberiBad file descriptor
. Saya akan menghargai jika Anda memperbaikinya atau menghapusnya; informasi yang salah tidak banyak membantu.Gunakan
mktemp
untuk membuat file atau direktori sementara:Atau untuk direcotry:
Di akhir skrip Anda harus menghapus file / dir sementara:
mktemp membuat file di
/tmp
direktori atau di dalam drectory yang diberikan dengan--tmpdir
argumen.sumber
trap "rm -f $temp_file" 0 2 3 15
tepat setelah membuat file sehingga ketika skrip keluar atau dihentikan denganctrl-C
file tersebut masih dihapus.EXIT
hanya kait untuktrap
?kill -9 $somepid
. Sinyal pembunuhan khusus itu adalah kematian tanpa kejadian lain.bash -c 'echo $$; trap "echo foo" 0; sleep 5'
EXIT
sudah cukup.Jika Anda menggunakan sistem yang memiliki mktemp , Anda harus menggunakannya sebagai jawaban lain.
Dengan POSIX toolchest:
sumber
EXIT
hanya kait untuktrap
?tmpfile
masih bisa dihapus sebelum skrip keluar, tetapi tidak ketika skrip menerima sinyal lain.That's not what happens
?mktemp
berasal dari HP / UX dengan sintaks yang berbeda. Todd C. Miller menciptakan yang berbeda untuk OpenBSD pada pertengahan 90-an (disalin oleh FreeBSD dan NetBSD) dan kemudian membuatnya juga tersedia sebagai utilitas mandiri (www.mktemp.org). Itulah yang biasanya digunakan di Linux sampaimktemp
utilitas (kebanyakan yang kompatibel) ditambahkan ke GNU coreutils pada tahun 2007. Hanya untuk mengatakan orang tidak bisa benar-benar mengatakanmktemp
adalah utilitas GNU.Beberapa shell memiliki fitur bawaan.
zsh
zsh
's=(...)
bentuk substitusi proses menggunakan file sementara. Misalnya=(echo test)
memperluas ke jalur file sementara yang berisitest\n
.File itu secara otomatis dihapus, setelah perintah selesai.
bash / zsh di Linux.
File di sini atau di sini-string di
bash
danzsh
diimplementasikan sebagai file sementara yang dihapus.Jadi, jika Anda melakukannya:
File descriptor 3 terhubung ke file sementara dihapus yang berisi
test\n
.Anda bisa mendapatkan kontennya dengan:
Jika di Linux, Anda juga dapat membaca atau menulis ke file itu melalui
/dev/fd/3
(beberapa kerang lain menggunakan pipa, atau dapat digunakan
/dev/null
jika dokumen di sini kosong).POSIX
Tidak ada
mktemp
utilitas POSIX. Namun POSIX menentukanmkstemp(template)
API C , danm4
utilitas standar memperlihatkan API itu denganmkstemp()
fungsi m4 dengan nama yang sama.mkstemp()
memberi Anda nama file dengan bagian acak yang dijamin tidak ada pada saat fungsi dipanggil. Itu membuat file dengan izin 0600 dengan cara bebas ras.Jadi, Anda bisa melakukan:
Namun perlu dicatat bahwa Anda perlu menangani pembersihan saat keluar, meskipun jika Anda hanya perlu menulis dan membaca file beberapa kali, Anda dapat membukanya dan menghapusnya setelah membuat seperti untuk di sini-doc / di sini- pendekatan string di atas:
Anda dapat membuka file untuk membaca sekali, dan memundurkan di antara dua bacaan, namun tidak ada utilitas POSIX yang dapat melakukan rewinding (
lseek()
), sehingga Anda tidak dapat melakukannya dengan mudah dalam skrip POSIX (zsh
(sysseek
builtin) danksh93
(<#((...))
operator) dapat lakukan saja).sumber
<()
=(...)
.Berikut ini adalah jawaban yang sedikit lebih baik di jajaran Hauke Laging:
sumber
Alur kerja saya biasanya dengan file temp adalah karena beberapa skrip bash yang saya uji. Saya ingin
tee
itu jadi saya bisa melihat itu berfungsi dan menyimpan output untuk iterasi selanjutnya dari proses saya. Saya telah membuat file bernamatmp
sehingga saya bisa menggunakannya seperti
Alasan saya menyukai datetime yang diformat sebelum nilai-nilai acak adalah ia memungkinkan saya menemukan file tmp yang baru saja saya buat dengan mudah, dan saya tidak perlu memikirkan apa nama untuk itu waktu berikutnya (dan fokus hanya pada mendapatkan skrip dang saya bekerja).
sumber