Класичний сценарій з операторською перевагою, у вас є такий рядок:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
І ви не знаєте, чи розібраний він ((A && B) | C) чи (A && B | C)...
Майже офіційна документація FOUND тут не перераховує трубку в списку , так що я не можу просто перевірити в таблиці.
Крім того, в bash, (це не тільки для зміни порядку операцій, але створює підзарядку , тому я не на 100% впевнений, що цей рядок є еквівалентом попереднього рядка:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
Більш загально, як знати AST лінії баш? У python у мене є функція, яка дає мені дерево, щоб я міг легко двічі перевірити порядок роботи.
bashвикористовує аналізатор yacc не якусь спеціальну річ; якщо запустити це через yacc -vнього, ви отримаєте y.outputгарну граматику, яка показує, що &&і ||комбінувати списки, а списки зрештою складаються з конвеєрів (а не зворотного); tl; dr; A && B | Cтаке саме A && { B | C; }, як і очікувалося. Не приймайте жодного порядку виконання між Bта C; команди в трубопроводі виконуються паралельно .
[...]тестів та $((...))арифметичних оцінок; зокрема, ||і &&як це використовується у списку команд на мові оболонки, має однаковий пріоритет , на відміну від відповідних операторів в Cабо в арифметичній оцінці (де &&пов'язується більш щільно, ніж ||).
|це лише роз'єм, який відповідає LHS-виходу в STS RHS. Отже, якщоcdкоманда у вашому прикладі не вдасться, вона не надіслала б ніякого виводуhead, алеheadнасправді все-такиexecuteпроаналізувала б нічого і не поверне жодного результату.