Cara menggunakan perintah arloji dengan rantai perintah / program yang disalurkan

51

Saya biasanya pengguna watchutilitas linux untuk menonton output dari suatu perintah berulang kali setiap n detik, seperti diwatch df -h /some_volume/

Tapi sepertinya saya tidak bisa menggunakan watchdengan serangkaian perintah pipa seperti:

$ watch ls -ltr|tail -n 1

Jika saya melakukan itu, saya watchbenar-benar menonton ls -ltrdan output sedang diteruskan tail -n 1yang tidak menghasilkan apa-apa.

Jika saya coba ini:

$ watch (ls -ltr|tail -n 1)

saya mendapat

$ watch: syntax error near unexpected token `ls'

Dan salah satu dari yang berikut ini gagal karena beberapa alasan:

$ watch <(ls -ltr|tail -n 1)

$ watch < <(ls -ltr|tail -n 1)

$ watch $(ls -ltr|tail -n 1)

$ watch `ls -ltr|tail -n 1)`

Dan akhirnya jika melakukan ini:

$ watch echo $(ls -ltr|tail -n 1)

Saya melihat tidak ada perubahan dalam output pada interval yang diberikan karena perintah di dalam $()dijalankan hanya sekali dan string output yang dihasilkan selalu dicetak ("diawasi") sebagai literal.

Jadi, bagaimana cara membuat watchperintah bekerja dengan rantai perintah pipa [selain yang menempatkannya di dalam skrip]?

Tulains Córdova
sumber
jalankan man watchdan gulir ke bawah ke contoh ...
don_crissti

Jawaban:

82
watch 'command | othertool | yet-another-tool'
DopeGhoti
sumber
1
Mungkin perlu dicatat pendekatan generik juga watch sh -c 'command | etc'terutama melihat pendekatan yang dicoba dalam pertanyaan.
sourcejedi
@sourcejedi saya belum benar-benar tahu mengapa, tetapi ini tidak akan selalu menghasilkan hasil yang sama.
Michael Mior
12
watch -n 1 "ls -lrt | tail -n20; date"

mari kita pipa dan jalankan berturut-turut.

Soft Dot IE
sumber
apa -n 1untuk?
Nam G VU
2
@NamGVU: Jalankan perintah setiap 1 detik
Duc Tran
2

Jika Anda ingin membuat daftar semua file dalam subdirektori juga, Anda dapat menggunakan perintah find dengan opsi exec.

watchakan memperbarui setiap 30 detik dan findakan mencari semua file * .log dalam direktori saat ini (termasuk subdirektori) dan akan mencetak nama file dan 10 baris terakhir mereka:

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
yoyomanYo
sumber