GNU/Linux >> Belajar Linux >  >> Linux

Grep -v Perilaku Tak Terduga?

Katakanlah saya memiliki skrip bodoh sederhana yang menghapus file dengan mengakhiri, terlihat seperti ini:

rm *.uvw *.xyz

Skrip, atau rm , tepatnya, menulis pesan di stderr jika tidak dapat menemukan setidaknya satu file dengan akhiran yang ditentukan.

Sekarang katakanlah skripnya sedikit lebih besar dan melakukan sedikit lebih banyak dengan jenis file yang sedikit lebih banyak dan saya tidak tertarik dengan jenis file mana yang ada dan mana yang tidak, tetapi keluhan tentang jenis file yang tidak ada menghalangi sisanya output dan pesan kesalahan saya lebih tertarik, jadi saya ingin memfilter output:

rm *.uvw *.xyz 2>&1 | grep -v "No such file or directory"

Ini berfungsi dengan baik untuk sebagian besar, tetapi menghapus bagian pesan dari dialog interaktif, yang misalnya menanyakan, apakah file yang dilindungi penulisan harus dihapus, jadi saya diminta tanpa pesan yang sesuai.

Saya tidak memahami perilaku ini dan tidak dapat menemukan informasi terkait. Adakah yang bisa menjelaskan ini?

Jawaban yang Diterima:

Masalahnya

Ketika rm meminta penggunaan untuk input, itu tidak menempatkan baris baru di akhir prompt:

$ rm *.uvw *.xyz
rm: remove write-protected regular empty file 'a.xyz'?

grep berbasis garis. Itu hanya dapat memproses baris lengkap. Itu tidak dapat menentukan apakah garis harus dicetak sampai garis selesai. Jadi, utilitas standar untuk menangani buffering, seperti stdbuf , tidak bisa membantu.

Solusinya

Gunakan nullglob dan hapus pesan file yang hilang.

Tanpa nullglob, pesan yang tidak Anda inginkan muncul:

$ rm *.uvw *.xyz
rm: cannot remove '*.uvw': No such file or directory
rm: remove write-protected regular empty file 'a.xyz'? n

Dengan itu, pesan “Tidak ada file atau direktori” ditekan:

$ shopt -s nullglob
$ rm *.uvw *.xyz
rm: remove write-protected regular empty file 'a.xyz'? n

Penyempurnaan

Jika tidak ada file sama sekali yang cocok dengan salah satu glob, maka akan muncul pesan error yang berbeda:

$ shopt -s nullglob
$ rm *.uvw *.xyz
rm: missing operand
Try 'rm --help' for more information.

Cara sederhana untuk menghindarinya adalah dengan memastikan bahwa setidaknya ada satu file seperti itu:

shopt -s nullglob
[ -e "deleteme.xyz" ] ||touch deleteme.xyz
rm *.uvw *.xyz

Sejak deleteme.xyz tetap akan terhapus, tidak ada salahnya menyentuhnya sebelum kita menjalankan rm .


Linux
  1. Grep:Memori Habis?

  2. Perilaku Tak Terduga Dari Skrip Shell?

  3. Perintah grep Linux

  1. Menggunakan grep untuk mencari secara terbalik

  2. Bagaimana cara saya grep secara rekursif?

  3. Lebih elegan ps aux | grep -v grep

  1. Memeriksa Skrip Apakah Berjalan?

  2. Cara grep \n dalam file

  3. Redirect strace ke file