Menekan pesan 'file terpotong' saat menggunakan ekor

11

Saya tailing menggunakan file log tail -f messages.logdan ini adalah bagian dari output:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Fusce eget tellus sit amet odio porttitor rhoncus. 
Donec consequat diam sit amet tellus viverra pellentesque. 
tail: messages.log: file truncated
Suspendisse at risus id neque pharetra finibus in facilisis ipsum.

Ini menunjukkan tail: messages.log: file truncatedketika file terpotong secara otomatis dan itu seharusnya terjadi, tetapi saya hanya ingin tailmenunjukkan kepada saya output tanpa pesan terpotong ini.

Saya sudah mencoba menggunakan tail -f messages.log | grep -v truncatedtetapi tetap menunjukkan pesan kepada saya.

Apakah ada metode untuk menekan pesan ini?

Bas Peeters
sumber

Jawaban:

15

Pesan itu adalah output pada stderr seperti semua pesan peringatan dan kesalahan.

Anda dapat menghapus semua output kesalahan:

tail -f file 2> /dev/null

Atau untuk memfilter hanya pesan kesalahan yang berisi truncate:

{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1

Namun itu berarti bahwa Anda kehilangan status keluar dari tail. Beberapa shell memiliki pipefailopsi (diaktifkan dengan set -o pipefail) untuk pipa tersebut untuk melaporkan status keluar tailjika gagal. zshdan bashjuga dapat melaporkan status masing-masing komponen pipa dalam $pipestatus/ $PIPESTATUSarray mereka.

Dengan zshatau bash, Anda dapat menggunakan:

tail -f file 2> >(grep -v truncated >&2)

Tetapi berhati-hatilah karena grepperintah tersebut tidak ditunggu, jadi pesan kesalahan jika ada akhirnya ditampilkan setelah tailkeluar dan shell sudah mulai menjalankan perintah berikutnya dalam skrip.

Di zsh, Anda dapat mengatasinya dengan menuliskannya:

{ tail -f file; } 2> >(grep -v truncated >&2)

Itu dibahas dalam zshdokumentasi di info zsh 'Process Substitution':

Ada masalah tambahan dengan >(PROCESS); ketika ini dilampirkan ke perintah eksternal, shell induk tidak menunggu PROSES selesai dan karenanya perintah segera berikut tidak dapat mengandalkan hasil yang lengkap. Masalah dan solusinya sama seperti yang dijelaskan di bagian MULTIOS dalam catatan Redirection :: . Oleh karena itu dalam versi sederhana dari contoh di atas:

paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)

(perhatikan bahwa tidak ada MULTIOS yang terlibat), PROSES akan dijalankan secara asinkron sejauh menyangkut shell induk. Solusinya adalah:

{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)

Proses ekstra di sini dihasilkan dari shell induk yang akan menunggu penyelesaiannya.

Stéphane Chazelas
sumber
Apakah ada alasan Anda memilih subkulit ( )daripada perintah yang rumit { }?
Tom Hale
@ TomHale. Tidak ada alasan bagus. Lihat edit. Terima kasih.
Stéphane Chazelas
2

Jika greptidak menghilangkan output, kemungkinan besar akan dicetak pada kesalahan standar. Cara termudah untuk menghilangkannya adalah dengan membuangnya:

tail -f messages.log 2>/dev/null
l0b0
sumber
1
Melakukan trik, tetapi juga menekan pesan lain.
Bas Peeters
Yap, @ StéphaneChazelas punya solusi yang lebih kompleks tetapi hanya mengabaikan pesan yang relevan.
l0b0
1

Mungkin membantu jika bisa diperbaiki asal kesalahan ini. Itu terjadi karena sesuatu menulis ke file dengan menimpa ">" bukan dengan menambahkan ">>".

BG Bruno
sumber