Où sont les continuations de lignes de bash après && et || documenté?


28

J'ai beaucoup vu cette construction dans les scripts et je l'ai utilisée moi-même, mais cela me dérange de ne pas pouvoir la trouver dans la documentation.

Exemple:

[ -f file1 ] &&
[ -f file2 ] &&
echo "Both files exist." ||
echo "One or the other file doesn't exist."

Cela pourrait également être fait avec des barres obliques inverses avant les nouvelles lignes, comme mentionné dans man bash:

If a \<newline> pair appears,  and  the  backslash  is  not
itself  quoted,  the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).

Exemple:

[ -f file1 ] && \
[ -f file2 ] && \
echo "Both files exist." || \
echo "One or the other file doesn't exist."

... mais cela ne semble pas nécessaire. La première version ci-dessus fonctionne même sans les barres obliques inverses.

Où puis-je trouver cela man bash? (De plus, est-ce bashspécifique ou conforme à POSIX?)


Si vous recherchez une documentation bash ou POSIX officielle, consultez la réponse de Gilles. Mais cela est discuté dans Quels sont les opérateurs de contrôle et de redirection du shell? - Plus d' observations sur ;, &, (et) .
G-Man dit `` Réintègre Monica ''

@ G-Man, je suppose que cela ne s'adressait pas à moi? Juste pour les futurs lecteurs? Comme je l'ai dit dans la question, «cela me dérange de ne pas pouvoir le trouver dans la documentation». Je savais déjà comment cela fonctionne, il ne s'agissait donc que d'une demande de documentation officielle. :)
Wildcard

Même dans le cas des tableaux, il y a une continuation de ligne implicite: names=( Rama Soma<newline> Sita Diya ). Python les décrit clairement ici, mais la documentation Bash ne semble pas le faire.
jamadagni

Réponses:


39

Une nouvelle ligne est ignorée dans quelques contextes où il y a manifestement une commande non terminée. Ces contextes comprennent , après un opérateur de commande ( &&, ||, |, &, ;, ;;, mais pas !).

Je ne vois pas cela documenté dans le manuel bash.

Dans POSIX, il est spécifié via les règles de grammaire . Partout où les règles ont linebreak, vous pouvez avoir zéro ou plusieurs sauts de ligne.


+1, je ne savais pas que cela fonctionnait pour la simple pipe (|). Je souhaite que nous puissions également les mettre sur la ligne suivante, pour plus de lisibilité, mais cela ne fonctionne pas de cette façon (si vous faites cela, vous devez espace la nouvelle ligne précédente).
Olivier Dulac

1
@OlivierDulac Comment cela pourrait-il fonctionner? Lorsqu'il traite la ligne de commande actuelle, comment est-il censé savoir que vous prévoyez de taper |au début de la ligne suivante? N'oubliez pas, le shell est également utilisé de manière interactive, pas seulement dans les scripts, et la grammaire est la même.
Barmar

@Barmar: Je sais, je le sais (a écrit des compilateurs à l'école ^^) ... J'ai dit "je souhaite", et ce n'est pas un souhait très plausible
Olivier Dulac

1
@DocSalvager, pouvez-vous donner un exemple de bogue logique qui aiderait à prévenir? J'ai du mal à le voir ....
Wildcard

2
@DocSalvager, je n'utiliserais pas réellement le code tel que je l'ai écrit - c'était une illustration. Sans la dernière ligne (la clause else), je l'utiliserais de cette façon, cependant. (Pour "si ceci et ceci font cela" this && this2 && thatest très bien mais pour une elseclause, j'utiliserais un réel if then else fi.)
Wildcard
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.