Классический сценарий с приоритетом оператора, у вас есть такая строка:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
И вы не знаете, если это проанализировано ((A && B) | C)или (A && B | C)...
Почти официальная документация нашла здесь не перечисляет трубку в списке , так что я не могу просто проверить в таблице.
Кроме того, в bash он (предназначен не только для изменения порядка операций, но и создает подоболочку , поэтому я не уверен на 100%, что эти строки эквивалентны предыдущей строке:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
В общем, как узнать AST линии bash? В Python у меня есть функция, которая дает мне дерево, чтобы я мог легко проверить порядок операций.
bashиспользует парсер yacc не какую-то специальную вещь; если вы пройдете через yacc -vэто, вы получите y.outputкрасивую грамматику, которая показывает это &&и ||объединяет списки, а списки в конечном итоге состоят из конвейеров (а не наоборот); ТЛ; др; A && B | Cтак же A && { B | C; }, как и ожидалось. Не принимайте никакой порядок исполнения между Bи C; Команды в конвейере выполняются параллельно .
[...]тестов и $((...))арифметических оценок; в частности, ||и &&при использовании со списком команд в языке оболочки имеют тот же приоритет , в отличие от соответствующих операторов в Cили в арифметической оценке (где &&связывается более тесно, чем ||).
|это просто разъем, который подходит для стандартного вывода LHS и стандартного подключения RHS. Таким образом, еслиcdкоманда в вашем примере завершится неудачно, она не будет отправлять выходные данныеhead, ноheadна самом деле все равно будетexecuteанализировать ничего и не будет возвращать никаких результатов.