perintah bash watch dengan warna yang dipertahankan

57

Dari man watch:

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

Jadi, bagaimana saya menggunakan cat -vjika saya ingin melihat keluaran berwarna dari:

watch ls -al --color
Paweł Gościcki
sumber

Jawaban:

63

Perintah yang benar adalah

watch --color "ls -a1 --color"

Itu tidak didokumentasikan di halaman manual atau layar --help. Saya harus menggunakan string untuk menemukannya.

kuda kertas
sumber
@ PawełGościcki Nevermind, sudah menemukannya di gitorious, meskipun, tidak bisa membuatnya bekerja dengan phpunit.
Ikke
1
Arloji saya v0.3.0 dan saya di Ubuntu 10.0
Paweł Gościcki
2
Saya juga versi 0.3.0 dan untuk sederhana "ls --color" perintah arloji akan bekerja tetapi untuk beberapa alasan skenario yang lebih kompleks tidak: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"akan memakan warna :(
math
@math: Cobalah menukar kutipan tunggal dan ganda Anda.
Dennis Williamson
The watchfrom procps (default pada kebanyakan distro Linux, saya percaya) memiliki --coloropsi sejak V3.3.2.
sleske
27

Saya pikir itu tidak mungkin dengan perintah 'jaga'. Ini cara yang lebih panjang untuk melakukannya:

while true; do clear; date;echo;ls -al --color; sleep 2; done

Anda dapat memasukkan ini ke dalam skrip, misalnya:

echo "while true; do clear; date;echo;\$*;sleep 2; done" > watch2
chmod +x watch2
./watch2 ls -al --color

Untuk memperjelas, inilah mengapa saya pikir itu tidak mungkin dengan perintah 'menonton'. Lihat apa yang terjadi jika Anda menggunakan cat -v:

watch "ls -al --color|cat -v"

Ini menunjukkan kepada Anda karakter kontrol warna ... yang saya pikir bukan yang Anda inginkan.

davr
sumber
man watchjelas menunjukkan bahwa itu harus mungkin tanpa dissing watch.
Paweł Gościcki
Itu tidak mengatakan Anda akan dapat melihat warna. Dikatakan Anda akan dapat melihat karakter yang tidak dapat dicetak. Coba perintah saya seperti di atas dengan cat -vuntuk melihat apa yang man watchsedang dibicarakan.
davr
1
Anda dapat mengurangi durasi blink sedikit dengan a) mengumpulkan data yang akan ditampilkan ke dalam variabel, b) membersihkan layar, c) mencetak variabel.
Nick Russo
1
@NickRusso terima kasih atas sarannya. Sesuatu seperti ini sangat mengurangi kerlip:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Kevin Mark
1
@KevinMark: Anda harus menggunakan tanda kutip untuk menangani beberapa baris: echo "$out". stackoverflow.com/q/2414150/86967
nobar
6

Jika Anda menggunakan Mac, seperti saya, watchdari Homebrew tidak mendukung warna.

Apa yang Anda inginkan adalah fswatch tetapi belum Homebrew. Untuk menginstalnya, Anda harus melakukan yang sedikit lebih berbelit-belit

https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3‌​/Library/Formula/fswatch.rb

Lihat jawaban SO ini untuk penggunaan.

fatuhoku
sumber
2
Ini hanya berfungsi untuk sistem berkas, sementara watchberlaku untuk sebuah perintah
Brice
fswatch tersedia di Homebrew 0.9.5
code_monk
1

UPDATE : Ternyata versi terbaru watchmemperbaiki masalah. Jadi, jika warnanya watch --colorsalah, mungkin lebih baik memperbaruinya saja (di sistem saya, ada di procpspaket).


Dukungan warna dalam watch --colorpengalaman saya terbatas (meskipun cukup untuk ls -l --color). Inilah versi saya dari jawaban @ davr dengan beberapa fitur tambahan, yang terpenting adalah pengurangan kedipan. Anda dapat meletakkannya di .bashrc Anda dan menggunakannya sebagai cwatch ls -l --color.

# `refresh cmd` executes clears the terminal and prints
# the output of `cmd` in it.
function refresh {
  tput clear || exit 2; # Clear screen. Almost same as echo -en '\033[2J';
  bash -ic "$@";
}

# Like watch, but with color
function cwatch {
   while true; do
     CMD="$@";
     # Cache output to prevent flicker. Assigning to variable
     # also removes trailing newline.
     output=`refresh "$CMD"`;
     # Exit if ^C was pressed while command was executing or there was an error.
     exitcode=$?; [ $exitcode -ne 0 ] && exit $exitcode
     printf '%s' "$output";  # Almost the same as echo $output
     sleep 1;
   done;
}

Anda juga dapat mencoba hal-hal seperti

cwatch 'ls -l --color | head -n `tput lines`'

jika terminal Anda memiliki garis lebih sedikit daripada output. Itu hanya bekerja jika semua garis lebih pendek dari lebar terminal. Solusi terbaik yang saya tahu adalah:

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'
user21952-is-a-great-name
sumber