Warna dengan perintah unix "jam tangan"?

Jawaban:

146

Beberapa versi yang lebih baru watchsekarang mendukung warna.

Misalnya watch --color ls -ahl --color.

Terkait .

Dijeda sampai pemberitahuan lebih lanjut.
sumber
3
lihat di: superuser.com/questions/125469/… (jawaban pertama) - Mungkin Anda bisa menautkannya di jawaban Anda.
aatdark
11
Saya datang ke sini untuk menggunakan watchdengan git diff. FWIW, untuk mendapatkan yang bekerja Anda harus lulus dalam --color=alwaysuntuk git diff(misalnya watch --color git diff --color=always.
theabraham
30

Jangan gunakan watch... Ketika Anda menggunakan program jam tangan dapat mendeteksi mereka tidak menulis ke terminal dan kemudian menghapus warnanya. Anda harus menggunakan flag program tertentu untuk menyimpan kode kontrol di sana.

Jika Anda tidak tahu benderanya atau tidak ada, Anda dapat membuat orang miskin berjaga dengan cara:

while sleep <time>; do clear; <command>; done

Ini akan memiliki sedikit flicker (arloji berfungsi "buffer ganda") tetapi untuk beberapa hal itu cukup berguna.

Anda mungkin tergoda untuk membuat jam tangan pria malang dengan buffer ganda

while sleep <time>; do <command> > /tmp/file; clear; cat /tmp/file; done

Tapi kemudian Anda akan menekan lagi fitur "Saya tidak menulis ke terminal".

teis
sumber
Mungkin digunakan while sleep <time>; do clear; <command> | tee /tmp/file; donesebagai pengganti >dan cat?
André Leria
mmm Saya tidak mengerti @ AndréLeria ... | tee akan menghapus kode warna seperti watchdo dan tidak mencegah perintah berkedip
theist
Ini adalah saran untuk contoh kedua, yang juga tidak memberi saya warna. Atau mungkin saya melakukan sesuatu yang salah?
André Leria
1
@ AndréLeria "Contoh" kedua adalah contoh yang salah (Seperti yang dikatakan di baris las). Intinya adalah begitu Anda menekan pipa, Anda kehilangan kode warna karena Anda tidak menulis ke terminal. Itu ada untuk menunjukkan betapa salahnya mencoba mengkompensasi flicker karena selang waktu antara jelas dan eksekusi perintah target menggunakan pipa untuk bekerja dengan buffer sepertiwatch
theist
5
Dalam bash: while sleep <time> ; do x="$( <command> 2>&1 )" ; clear ; echo "$x" ; done- Ini hanya menggunakan shell bawaan untuk membersihkan layar dan menampilkan output, oleh karena itu menjadi alternatif yang paling tidak berkedip.
Géza Török
17

Anda dapat menduplikasi operasi fundamental tanpa embel-embel watchdalam beberapa baris skrip shell.

$ cat cheapwatch 
#!/bin/sh

# Not quite your Rolex

while true ; do
  clear
  printf "[%s] Output of %s:\n" "$(date)" "$*"
  # "$@" <- we don't want to do it this way, just this:
  ${SHELL-/bin/sh} -c "$*"
  sleep 1  # genuine Quartz movement
done

$ ./cheapwatch ls --color  # no problem

Akhirnya, seseorang yang sangat pintar akan meretas trperintah ke skrip ini yang menghapus karakter kontrol, dan kemudian memaksa pengguna untuk menggunakan --coloruntuk menonaktifkan logika itu. Untuk saat ini, kenaifan belaka dari penerapan ini adalah menjauhkan monster pemakan warna itu.

Jika Anda berada dalam situasi di mana watchtidak memiliki --coloropsi dan Anda tidak dapat memutakhirkan paket karena alasan apa pun, mungkin Anda dapat memasukkannya.

Kaz
sumber
8

Sementara jawaban lain memecahkan masalah ini, cara termudah untuk melakukannya adalah dengan menggunakan unbufferalat tersebut. Untuk menggunakannya cukup lakukan:

$ watch --color 'unbuffer <your-program>'

Dengan cara ini Anda tidak perlu mencari urutan kontrol yang mengaktifkan flag program Anda. Namun peringatannya adalah bahwa versi jam tangan Anda harus mendukung --colorbendera tersebut.

Anda dapat menginstal unbuffer di Debian atau Ubuntu menggunakan sudo apt-get install expect.

lol
sumber
'unbuffer <command>'- Tanpa memberikan perintah khusus untuk digunakan, bagaimana cara ini menjawab pertanyaan?
Danoram
@Danoram Apa yang tidak jelas bagi Anda? Apakah Anda memerlukan bantuan untuk mengganti <command>dengan program tertentu yang ingin Anda jalankan dengan warna?
Avamander
@Avamander Saya akan menulis komentar itu karena pertanyaan itu ditandai. Jika Anda memeriksa riwayat edit, Anda akan melihat penulis memperbarui jawabannya. Tidak ada yang tidak jelas. Komentar saya sudah tidak relevan lagi ..
Danoram
1

Dari arloji manual:

Karakter non-cetak dihilangkan dari keluaran program. Gunakan "cat -v" sebagai bagian dari pipeline perintah jika Anda ingin melihatnya.

Padahal, saya tidak yakin bagaimana cara menggunakannya.

Benoit
sumber
5
Hal ini menyebabkan karakter kontrol terlihat pada keluaran untuk saya, daripada menyebabkan pewarnaan. Misalnya watch -c "ls --color|cat -v"acara ^[[0m^[[01;34mAgent^[[0muntuk baris pertama.
Drew Noakes
1
cobawatch --color ls --color=always .
Zhang LongQI