Le scénario classique avec Operator Precedence, vous avez une ligne comme:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
Et vous ne savez pas si c'est analysé ((A && B) | C)ou (A && B | C)...
La documentation presque officielle trouvée ici ne répertorie pas le canal dans la liste, je ne peux donc pas simplement vérifier dans le tableau.
De plus, en bash, ce (n'est pas seulement pour changer l'ordre des opérations mais cela crée un sous-shell , donc je ne suis pas sûr à 100% que cette ligne est l'équivalent de la ligne précédente:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
Plus généralement, comment connaître l' AST d'une ligne bash? En python, j'ai une fonction qui me donne l'arbre afin que je puisse facilement vérifier l'ordre des opérations.
bashutilise un analyseur yacc pas quelque chose d'ad-hoc; si vous exécutez cela, yacc -vcela vous donnera y.outputune belle grammaire qui montre cela &&et ||combine des listes, et les listes sont finalement constituées de pipelines (et non l'inverse); tl; dr; A && B | Cest le même que A && { B | C; }, comme prévu. N'assumez aucun ordre d'exécution entre Bet C; les commandes d'un pipeline sont exécutées en parallèle .
[...]tests et $((...))les évaluations arithmétiques; en particulier, ||et &&comme utilisé avec la liste des commandes dans le langage shell ont la même priorité , contrairement aux opérateurs respectifs dans Cou dans l'évaluation arithmétique (où &&se lie plus étroitement que ||).
|s'agit que d'un connecteur qui adapte la sortie standard LHS à la sortie standard RHS. Donc, si lacdcommande de votre exemple échoue, elle n'enverra aucune sortie àhead, maisheaden faitexecute, analysera le rien et ne retournera aucune sortie.