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.