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

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.


@ 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.


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.


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'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.