bash guarda il comando con i colori conservati


57

Da man watch:

I caratteri non stampabili vengono eliminati dall'output del programma. Utilizzare "cat -v" come parte della pipeline di comandi se si desidera vederli.

Quindi, come posso usare cat -vse voglio vedere l'output colorato da:

watch ls -al --color

Risposte:


63

Il comando giusto è

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

Non è documentato nella pagina man o nella schermata --help. Devo usare le stringhe per trovarlo.


@ PawełGościcki Nevermind, l'ho già trovato su gitorious, sebbene non sia riuscito a farlo funzionare con phpunit.
Ikke,

1
Il mio orologio è v0.3.0 e sono su Ubuntu 10.0
Paweł Gościcki il

2
Ho anche la versione 0.3.0 e per semplice "ls --color" il comando watch funzionerà ma per qualche ragione gli scenari più complessi no: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"mangeranno i colori :(
matematica

@math: prova a scambiare le virgolette singole e doppie.
Dennis Williamson,

Il watchprocps (il default sulla maggior parte delle distro Linux, credo) ha --colorun'opzione dal V3.3.2.
sleske,

27

Penso che potrebbe non essere possibile con il comando 'watch'. Ecco un modo più lungo di farlo:

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

Puoi inserirlo in uno script, ad esempio:

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

Per chiarire, ecco perché penso che non sia possibile con il comando 'watch'. Vedi cosa succede se usi cat -v:

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

Ti mostra i caratteri di controllo del colore ... che penso non sia quello che vuoi.


man watchsuggerisce chiaramente che dovrebbe essere possibile senza dissing watch.
Paweł Gościcki,

Non dice che sarai in grado di vedere i colori. Dice che sarai in grado di vedere i caratteri non stampabili. Prova il mio comando come sopra con cat -vper vedere di cosa man watchstava parlando.
davr

1
È possibile ridurre leggermente la durata del lampeggio a) raccogliendo i dati da visualizzare in una variabile, b) svuotando lo schermo, c) stampando la variabile.
Nick Russo,

1
@NickRusso grazie per il suggerimento. Qualcosa del genere riduce notevolmente lo sfarfallio:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Kevin Mark,

1
@KevinMark: Si dovrebbe usare le virgolette per gestire più linee: echo "$out". stackoverflow.com/q/2414150/86967
Nobar

6

Se stai usando un Mac, come me, watchda Homebrew non supporta il colore.

Quello che vuoi è fswatch ma non è ancora Homebrew. Per installarlo ti consigliamo di fare un po 'più contorto

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

Vedi questa risposta SO per l'utilizzo.


2
Funziona solo con il filesystem, mentre si watchapplica a un comando
Brice

fswatch è disponibile su Homebrew 0.9.5
code_monk

1

AGGIORNAMENTO : risulta che le ultime versioni hanno watchrisolto il problema. Quindi, se i colori di watch --colorsono sbagliati, probabilmente è meglio aggiornarlo (sul mio sistema, è nel procpspacchetto).


Il supporto del colore watch --colorè limitato nella mia esperienza (anche se sufficiente per ls -l --color). Ecco la mia versione della risposta di @ davr con alcune funzionalità extra, soprattutto lo sfarfallio ridotto. Puoi metterlo nel tuo .bashrc e usarlo come 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;
}

Puoi anche provare cose come

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

se il tuo terminale ha meno linee dell'output. Funziona solo se tutte le linee sono più corte della larghezza del terminale, però. La migliore soluzione che conosco per questo è:

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.