tee
ничего не знает о цветах. Но некоторые приложения выдают цветной вывод только тогда, когда он идет на терминал, а не когда он идет в обычный файл или в канал. В таких случаях проверьте, можно ли сказать приложению, что оно все равно производит цветной вывод. Например, в OSX, для ls
нужно установить переменную окружения CLICOLOR_FORCE
.
Если приложение ведет себя по-другому, когда его вывод является терминалом и не может быть сконфигурирован, запустите его в терминале. Утилита script
выполняет команду в терминале и записывает выходные данные, экранированные последовательности, перерисовки экрана и все остальное.
script -q brew.log brew …
(Но разве варево уже не ведет журналы? Может быть, если установить HOMEBREW_LOGS
?)
.
Первая строка
echo systemctl\ {restart,status}\ sshd\;
расширить до 3 токенов
затем выполните эхо-эхо для двух последних токенов, и все выглядит нормально.
аналогично второй строке
systemctl\ {restart,status}\ sshd\;
расширяется на 2 токена
и bash пытаются найти исполняемый файл systemctl restart sshd;
, который не могут найти.
Возможно, вы захотите начать свое путешествие на темной стороне, используя eval systemctl\ {restart,status}\ sshd\;
остерегайтесь неожиданностей.
Это форма расширения Brace , выполненная в оболочке. Идея расширения фигурной скобки -верна, но способ ее использования здесь неверен. Когда ты собирался сделать:
systemctl\ {restart,status}\ sshd\;
Оболочка интерпретирует systemctl restart sshd;
как одну длинную команду и пытается выполнить ее, но не может найти двоичный файл для ее выполнения таким образом. Потому что на этом этапе оболочка пытается токенизировать элементы в командной строке перед построением полной команды с аргументами --, но этого еще не произошло.
Для таких известных значений расширения вы можете использовать eval
и по-прежнему быть в безопасности, но будьте уверены в том, что вы пытаетесь расширить с его помощью.
eval systemctl\ {restart,status}\ sshd\;
Но я бы предпочел использовать цикл с for
, вместо того, чтобы пытаться написать один -вкладыш или использоватьeval
:
for action in restart status; do
systemctl "$action" sshd
done
Это называется раскрытием фигурной скобки (, поскольку тег указывает ).
What did I do wrong here? Why doesn't it work?
Рассмотрим этапы чтения и выполнения командной строки в bash (на примере):
Вы пытаетесь повлиять на (2 )из (3 ). Разделение на основе ;
находится на стадии (2 ), когда выполняется разбор составных команд. К тому времени, как (3 )происходит для раскрытия фигурной скобки, уже слишком поздно пытаться создать составную команду.