команда bash watch із збереженими кольорами


57

Від man watch:

Символи, що не друкуються, вилучаються з програмного виводу. Використовуйте "cat -v" як частину командного конвеєра, якщо ви хочете їх побачити.

Тож як я можу використовувати, cat -vякщо хочу побачити кольоровий вихід із:

watch ls -al --color

Відповіді:


63

Правильна команда

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

Це не зафіксовано на сторінці "man" або на екрані --help. Мені доводиться використовувати рядки, щоб знайти його.


@ PawełGościcki Nevermind, вже знайшов його на великому, хоча не міг змусити його працювати з phpunit.
Іке

1
У мене годинник v0.3.0, і я на Ubuntu 10.0
Paweł Gościcki

2
Я також версії 0.3.0 і для простого "ls --color" команда watch буде працювати, але чомусь більш складних сценаріїв немає: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"буде їсти кольори :(
математика

@math: Спробуйте поміняти свої подвійні та подвійні лапки.
Денніс Вільямсон

watchВід Procps (за замовчуванням в більшості дистрибутивів Linux, я вважаю) , має --colorможливості , так як V3.3.2.
sleske

27

Я думаю, що це може бути неможливо за допомогою команди "спостерігати". Ось довший спосіб зробити це:

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

Ви можете помістити це в сценарій, наприклад:

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

Щоб уточнити, ось чому я вважаю, що це неможливо за допомогою команди "спостерігати". Подивіться, що станеться, якщо ви використовуєте cat -v:

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

Він показує вам символи керування кольором ... що, я думаю, не те, що ви хочете.


man watchоднозначно говорить про те, що це повинно бути можливим без відмови watch.
Paweł Gościcki

Це не говорить про те, що ви зможете побачити кольори. Це говорить про те, що ви зможете побачити символи, що не друкуються. Спробуйте мою команду, як описано вище, cat -vщоб побачити, про що man watchговорили.
davr

1
Ви можете трохи зменшити тривалість миготіння: a) збирати дані для відображення у змінну;
Нік Руссо

1
@NickRusso дякую за пропозицію. Щось подібне значно зменшує мерехтіння:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Кевін Марк

1
@KevinMark: Ви повинні використовувати лапки , щоб обробляти кілька рядків: echo "$out". stackoverflow.com/q/2414150/86967
nobar

6

Якщо ви використовуєте Mac, як я, watchвід Homebrew не підтримує колір.

Те, що ви хочете, - це fswatch, але це ще не домашня мова. Щоб встановити його, ви хочете зробити трохи більш звивистий

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

Дивіться цю відповідь щодо використання.


2
Це працює лише для файлової системи, тоді як watchстосується команди
Brice

fswatch доступний на Homebrew 0.9.5
code_monk

1

ОНОВЛЕННЯ : Вимикає останні версії watchвиправленої проблеми. Отже, якщо кольори watch --colorнеправильні, можливо, краще просто оновити його (у моїй системі це в procpsпакеті).


Підтримка кольорів watch --colorу моєму досвіді обмежена (хоча й достатня для ls -l --color). Ось моя версія відповіді @ davr з деякими додатковими функціями, найголовніше - зменшеним мерехтінням. Ви можете помістити його у свій .bashrc і використовувати як 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;
}

Ви також можете спробувати такі речі

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

якщо ваш термінал має менше ліній, ніж вихід. Це працює лише в тому випадку, якщо всі лінії коротші, ніж кінцева ширина. Найкращий спосіб, який я знаю для цього, це:

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.