Почему не systemctl \ {restart, status} \ sshd \; work?

tee ничего не знает о цветах. Но некоторые приложения выдают цветной вывод только тогда, когда он идет на терминал, а не когда он идет в обычный файл или в канал. В таких случаях проверьте, можно ли сказать приложению, что оно все равно производит цветной вывод. Например, в OSX, для ls нужно установить переменную окружения CLICOLOR_FORCE.

Если приложение ведет себя по-другому, когда его вывод является терминалом и не может быть сконфигурирован, запустите его в терминале. Утилита script выполняет команду в терминале и записывает выходные данные, экранированные последовательности, перерисовки экрана и все остальное.

script -q brew.log brew …

(Но разве варево уже не ведет журналы? Может быть, если установить HOMEBREW_LOGS?)

.

14
27.03.2018, 15:07
3 ответа

Первая строка

echo systemctl\ {restart,status}\ sshd\;

расширить до 3 токенов

  • эхо
  • systemctl перезапустить sshd;
  • статус systemctl sshd;

затем выполните эхо-эхо для двух последних токенов, и все выглядит нормально.

аналогично второй строке

systemctl\ {restart,status}\ sshd\;

расширяется на 2 токена

  • systemctl перезапустить sshd;
  • статус systemctl sshd;

и bash пытаются найти исполняемый файл systemctl restart sshd;, который не могут найти.

Возможно, вы захотите начать свое путешествие на темной стороне, используя eval systemctl\ {restart,status}\ sshd\;остерегайтесь неожиданностей.

6
27.01.2020, 19:50

Это форма расширения 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
26
27.01.2020, 19:50

Это называется раскрытием фигурной скобки (, поскольку тег указывает ).

What did I do wrong here? Why doesn't it work?

Рассмотрим этапы чтения и выполнения командной строки в bash (на примере):

  1. читает строку
  2. разбирает, возможно, составную команду на составные простые команды
  3. выполняет различные расширения простых команд (расширение фигурных скобок, разбиение слов, подстановку и т. д.)
  4. затем выполняет простые команды (с другими этапами, опущенными для ясности ).

Вы пытаетесь повлиять на (2 )из (3 ). Разделение на основе ;находится на стадии (2 ), когда выполняется разбор составных команд. К тому времени, как (3 )происходит для раскрытия фигурной скобки, уже слишком поздно пытаться создать составную команду.

19
27.01.2020, 19:50

Теги

Похожие вопросы