команда bash watch с сохранением цветов

57

От man watch:

Непечатные символы удаляются из вывода программы. Используйте «cat -v» как часть командного конвейера, если вы хотите их увидеть.

Так как мне использовать, cat -vесли я хочу увидеть цветной вывод из:

watch ls -al --color
Павел Гольчицкий
источник

Ответы:

63

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

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

Это не задокументировано на странице руководства или на экране --help. Я должен использовать строки, чтобы найти его.

paperhorse
источник
@ PawełGościcki Nevermind, уже нашел его на gitorious, но не смог заставить его работать с phpunit.
Ikke
1
Мои часы v0.3.0, и я нахожусь на Ubuntu 10.0
Павел Гольчицкий
2
У меня также версия 0.3.0, и для простого "ls --color" команда watch будет работать, но по некоторым причинам более сложные сценарии этого не делают: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"будут есть цвета :(
math
@math: попробуйте поменять местами одинарные и двойные кавычки.
Деннис Уильямсон
У команды watchprocps (по умолчанию в большинстве дистрибутивов Linux) есть --colorопция, начиная с V3.3.2.
Слёске
27

Я думаю, что это может быть невозможно с командой 'watch'. Вот более длинный способ сделать это:

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"

Он показывает вам символы управления цветом ... что я думаю, не то, что вы хотите.

Davr
источник
man watchясно говорит о том, что это должно быть возможно без диссинга watch.
Павел Гольчицкий,
Это не говорит, что вы сможете увидеть цвета. Там написано, что вы сможете увидеть непечатные символы. Попробуйте мою команду, как указано выше, cat -vчтобы увидеть, о чем man watchидет речь.
Давр
1
Вы можете немного уменьшить продолжительность мигания путем а) ​​сбора данных, которые должны отображаться в переменную, б) очистки экрана, в) печати переменной.
Ник Руссо
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, но это еще не Homebrew. Чтобы установить его, вам нужно сделать немного более замысловатым

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

Смотрите этот SO ответ для использования.

fatuhoku
источник
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'
user21952-это-большой-имя
источник