Следуя предыдущему примеру с bash
магией tcp сокетов, вот улучшенная версия, которая ожидает соединения в течение ограниченного количества времени.
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
Разница в том, что если соединение не было доступно в течение 15с
, - он не будет циклиться вечно, а выйдет с кодом ошибки.
Это полезно в скриптах init для ожидания готовности/доступности сервиса после запуска.
set -x
предназначен для сценариев оболочки bash, он не работает для бинарных файлов.
Если вам нравится отслеживать выполнение бинарных файлов, вам следует использовать отладчик (например, gdb
)
Похоже, вы хотели бы иметь сканер синтаксиса оболочки и синтаксический анализатор, который выводит найденные токены и действия, которые он предпринимает на пути к выполнению фактической команды.
Я не знаю ни одной оболочки, которая делает это, так как это значительно замедлит обработку, а также создаст огромное количество вывода для каждой даже немного сложной команды.
С 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
, в котором есть синтаксическая ошибка.