Saya sedang menulis makefile yang akan membersihkan beberapa file yang tidak berguna di akhir kompilasi. Jika target telah dibuat, tentu saja akan melewati target itu dan file yang tidak berguna mungkin tidak ada di sana. Jadi jika saya melakukan ini:
rm lexer.ml interpparse.ml interpparse.mli
Saya mungkin mendapatkan kesalahan karena salah satu file tidak ada. Apakah ada cara rm
untuk mengabaikan file-file ini?
Dalam membaca halaman manual, saya melihat opsi berikut:
-f Attempt to remove the files without prompting for confirma-
tion, regardless of the file's permissions. If the file does
not exist, do not display a diagnostic message or modify the
exit status to reflect an error. The -f option overrides any
previous -i options.
Kedengarannya hampir seperti yang saya inginkan, tetapi saya tidak begitu yakin tentang bagian izin. Apakah ada cara untuk melakukan ini?
rm
di kotak pasir? Sepertinya-f
melakukan persis apa yang Anda inginkan, terlepas dari globbing.-f
opsi masih mencoba menghapusnya. Itu akan gagal. Itu tidak akan memberitahu Anda itu gagal. Berguna jika nama file adalah variabel atau gumpalan.rm --interactive=never
yang bertindak sepertirm -f
kecuali itu mengembalikan status keluar kesalahan. lihat di sini untuk detail lebih lanjut: unix.stackexchange.com/questions/72864/…Jawaban:
The
-f
pilihan adalah pasti apa yang ingin Anda gunakan.Konfirmasi tentang izin file yang dimaksud adalah ini:
Jadi
rm
akan memperingatkan Anda jika Anda mencoba menghapus file yang tidak memiliki izin tulis untuk Anda. Ini diperbolehkan jika Anda memiliki izin menulis pada direktori tetapi agak aneh, itulah sebabnyarm
biasanya Anda diperingatkan.sumber
-i
.set -e
di semua skrip bash saya sehingga skrip keluar setelah perintah apa pun memberikan kesalahan. Saya sering ingin skrip memberi tahu saya jikarm
memberi kesalahan, tetapi tetap melanjutkan. berlanjut.Solusi lain adalah yang ini: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command
Cukup tambahkan pernyataan-OR setelah perintah Anda:
Dengan cara ini, ketika pernyataan # 1 gagal (melempar kesalahan), jalankan pernyataan # 2, yang sederhana
true
.sumber
rm -rf my/dir ||:
untuk menjadi lebih ringkas (:
kependekan daritrue
)Saya jauh terlambat ke pesta, tapi saya menggunakan ini sepanjang waktu. Dalam makefile, tambahkan
-
ke awal baris untuk mengabaikan nilai pengembalian baris itu. Seperti itu:sumber
Jika Anda tidak ingin menggunakan opsi -f, alternatifnya adalah:
Ini hanya akan menjaga kesalahan dari dicetak.
sumber
Jika Anda menemukan cara untuk membuat glob nama file,
rm
tidak akan mengeluh jika tidak dapat menemukan kecocokan. Jadi sesuatu sepertilexer.m* interpparse.*
, dll. Harus bekerja untuk Anda (hati-hati, Anda tidak menghapus terlalu banyak, tentu saja). Juga,-f
merupakan cara yang masuk akal, selama Anda tidak berharap izin file akan menyelamatkan Anda dari menghapus file yang tidak Anda inginkan - jika Anda tidak ingin menghapusnya, jangan meletakkannya dalam daftar.sumber
sudo rm -rf
.lexer.m?
...? Itu akan menangkaplexer.ml
danlexer.mz
, tetapi tidaklexer.mll
ataulexer.mla
.Opsi -f berarti Anda tidak akan diminta jika ada sesuatu yang tidak diharapkan. Itu tidak berarti bahwa izin tidak diperhitungkan.
Jika Anda tidak memiliki cukup hak untuk menghapus file, itu tidak akan dihapus.
TETAPI , jika Anda memiliki cukup hak untuk mengubah hak istimewa, file Anda akan dihapus. Ini adalah kasus ketika Anda adalah pemilik file dengan izin hanya baca untuk pemilik (-r --------). Sebagai pemilik, Anda dapat
chmod u+w
, lalu menghapusnya:rm -f
akan menghapus file itu.sumber
Mungkin bisa membantu garis yang serupa dengan:
Saya tahu bahwa ini tidak terlalu pintar, tetapi berhasil.
sumber
Sebuah alternatif:
Sayang sekali, Makefiles tidak dapat membagikan definisi fungsi shell di seluruh baris.
sumber
Inilah yang saya gunakan dalam skrip shell. Itu menyembunyikan pesan kesalahan dan kode kesalahan.
sumber
rm doesnotexist 2&> /dev/null
Anda dapat menyentuh file sebelum Anda rm. itu akan membuat mereka jika mereka tidak ada :-)
sumber
menulis kepada
rm -rf ppp>/dev/null 2>&1
Anda yang lebih baru, dapatkan pesan kesalahan Masalah terjadi, jika error menghasilkan bukan ke STDERR 2 tetapi STDOUT 1 ... Ini terjadi ketika perintah menghasilkan bukan kesalahan tetapi peringatan. Anda perlu mengatur filter dan menghapus pesan ini. Tapi kasus ini biasa saja.sumber
uji untuk melihat apakah file ada terlebih dahulu, jika ya, kemudian kirimkan ke rm. Maka kesalahan dari rm akan bermakna. -f atau mengabaikan pesan kesalahan biasanya lebih mencakup dari apa yang diinginkan seseorang. -Jika mungkin melakukan hal-hal yang tidak ingin Anda lakukan.
tambahkan lebih banyak klausa uji jika ada lebih banyak file yang Anda ingin pastikan ada.
sumber