Apakah aman untuk menghapus file skrip dari dalam skrip itu?

9

Bayangkan saya punya skrip foo. Ini harus dijalankan sekali ketika pengguna login dan tidak diperlukan setelah menjalankan yang sukses.

Pertanyaan saya: Apakah aman untuk menghapus file skrip dari dalam skrip?

Misalnya:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0
htorque
sumber
2
Tidak sepenuhnya tidak berhubungan, Anda dapat menggunakan #!/bin/bash -euntuk memastikan bahwa file skrip dihapus hanya jika tidak ada yang salah.
sr_
3
Ya, aman. Jika Anda ingin tahu, mengapa, baca stackoverflow.com/questions/2028874/…
jofel
2
@ jofel Kedengarannya bagus, saya sarankan Anda membuat ini jawaban. :-)
htorque
Jika ragu, Anda dapat mengganti dua baris terakhir dengan exec rm /path/to/foo.
kasperd

Jawaban:

5

Aman untuk menghapus file shell saat menjalankannya, karena penangan file tidak terpengaruh oleh (kembali) memindahkan file yang sesuai.

Untuk informasi lebih lanjut, lihat di sini .

Jofel
sumber
2
Perlu diketahui bahwa itu mungkin tidak berfungsi, tergantung pada sistem Anda (yaitu rm <it-self>tidak akan berhasil pada HP-Ux.
Ouki
1
@Ouki, mengapa? Bukankah itu melanggar POSIX?
maxschlepzig
3
@maxschlepzig POSIX memungkinkan penghapusan tautan terakhir ke executable yang saat ini dieksekusi gagal: unlinkmungkin gagal dengan ETXTBUSY. (Anehnya, "prosedur murni" dan "teks bersama" tidak didefinisikan dalam spesifikasi; AFAIK berarti komponen dari program yang dapat dieksekusi: yang dapat dieksekusi itu sendiri atau perpustakaan yang digunakannya). Semua kesatuan utama selain dari HP-UX memungkinkan yang dapat dieksekusi untuk diubah namanya dan dibatalkan tautannya.
Gilles 'SO- stop being evil'
2
@Ouki Itu seharusnya mudah untuk diselesaikan hanya dengan mengakhiri skripnya exec rm /path/to/foo.
kasperd
0

Saya selalu gugup tentang hal ini sehingga saya melakukannya:

(sleep 5; rm /path/to/shell/script) &
exit 0

Sebagai alternatif, Anda dapat berantai ke skrip sementara:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme
Michael Dillon
sumber
1
Di kedua pendekatan yang disarankan Anda masih akan ada proses shell yang belum selesai menjalankan skrip pada saat itu dihapus.
kasperd
Yang ingin Anda lakukan adalahexec rm /path/to/shell/script
osvein