Есть ли способ показать каждый шаг во время обработки команды?

Следуя предыдущему примеру с bash магией tcp сокетов, вот улучшенная версия, которая ожидает соединения в течение ограниченного количества времени.

timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'

Разница в том, что если соединение не было доступно в течение 15с, - он не будет циклиться вечно, а выйдет с кодом ошибки.

Это полезно в скриптах init для ожидания готовности/доступности сервиса после запуска.

7
28.11.2016, 19:46
2 ответа

set -x предназначен для сценариев оболочки bash, он не работает для бинарных файлов.

Если вам нравится отслеживать выполнение бинарных файлов, вам следует использовать отладчик (например, gdb)

-2
27.01.2020, 20:20

Похоже, вы хотели бы иметь сканер синтаксиса оболочки и синтаксический анализатор, который выводит найденные токены и действия, которые он предпринимает на пути к выполнению фактической команды.

Я не знаю ни одной оболочки, которая делает это, так как это значительно замедлит обработку, а также создаст огромное количество вывода для каждой даже немного сложной команды.

С bash, если вы компилируете оболочку самостоятельно с помощью макроса DEBUG, определенного и , если вы включаете все закомментированные вызовы функции itrace()в исходном коде оболочки 1 , тогда вы сможете получить немного того, что хотите увидеть:

bash-4.4$ if [[ "$BASHPID" = 10 ]] && [[ "$USER" = myself ]]; then echo hello me; fi
TRACE: pid 22914: parse_matched_pair[9]: open = " close = " flags = 0
TRACE: pid 22914: parse_matched_pair[9]: returning $BASHPID"
TRACE: pid 22914: parse_matched_pair[9]: open = " close = " flags = 0
TRACE: pid 22914: parse_matched_pair[9]: returning $USER"
TRACE: pid 22914: param_expand: `$BASHPID' pflags = 0

Здесь вы можете увидеть, как синтаксический анализатор выводит несколько отладочных операторов о поиске открывающих и закрывающих двойных кавычек и переменных оболочки. Позже другой шаг обработки сообщает нам, что выполняется расширение параметра $BASHPID, но перечислены далеко не все шаги.

Этот тип выходных данных отладки из bashболее полезен для людей, действительно занимающихся написанием и модификацией исходного кода оболочки, и определенно не предназначен для того, чтобы служить способом понимания разбора оболочки и интерпретации его входных данных.

Чтобы лучше познакомиться с синтаксисом и грамматикой оболочки, я предлагаю начать с определения грамматики оболочки POSIX (, которое довольно сложно и более или менее бессмысленно для тех, кто не могу прочитать EBNF).


1За исключением одного в lib/glob/glob.c, в котором есть синтаксическая ошибка.

2
27.01.2020, 20:20

Теги

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