Класичний сценарій з операторською перевагою, у вас є такий рядок:
(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
проаналізувала б нічого і не поверне жодного результату.