¿Dónde están las continuaciones de línea bash después de && y || documentado?

28

He visto mucho este constructo en los scripts y lo usé yo mismo, pero me molesta que parezca que no puedo encontrarlo en la documentación.

Ejemplo:

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

Esto también se podría hacer con barras invertidas antes de las nuevas líneas, como se menciona en 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).

Ejemplo:

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

... pero esto no parece ser necesario. La primera versión anterior funciona incluso sin las barras invertidas.

¿Dónde puedo encontrar esto man bash? (Además, ¿es esto bashespecífico o compatible con POSIX?)

Comodín
fuente
Si está buscando documentación oficial de bash o POSIX, consulte la respuesta de Gilles. Pero esto se discute en ¿Cuáles son los operadores de control y redirección del shell? - Más observaciones sobre ;, &, (y) .
G-Man dice 'reinstalar a Monica' el
@ G-Man, ¿supongo que eso no estaba dirigido a mí? ¿Solo para futuros lectores? Como dije en la pregunta, "me molesta que parezca que no puedo encontrarlo en la documentación". Ya sabía cómo funciona, así que esto fue solo una solicitud de documentación oficial. :)
Comodín el
Incluso en el caso de las matrices, hay una continuación de línea implícita: names=( Rama Soma<newline> Sita Diya ). Python los describe claramente aquí, pero la documentación de Bash no parece.
jamadagni

Respuestas:

39

Una nueva línea se ignora en algunos contextos donde hay un comando manifiestamente no terminado. Estos contextos incluyen después de un operador de control ( &&, ||, |, &, ;, ;;, pero no !).

No veo esto documentado en el manual de bash.

En POSIX, se especifica a través de las reglas gramaticales . Dondequiera que tengan las reglas linebreak, puede tener cero o más saltos de línea.

Gilles 'SO- deja de ser malvado'
fuente
+1, no sabía que funcionaba para la tubería simple (|). Desearía que también pudiéramos ponerlos en la siguiente línea, para facilitar la lectura, pero no funciona de esa manera (si lo hace, debe espaciar la nueva línea anterior).
Olivier Dulac
1
@OlivierDulac ¿Cómo podría funcionar eso? Cuando procesa la línea de comando actual, ¿cómo se supone que debe saber que está planeando escribir |al comienzo de la siguiente línea? Recuerde, el shell también se usa de forma interactiva, no solo en scripts, y la gramática es la misma.
Barmar
@Barmar: Lo sé, lo sé (escribí compiladores en la escuela ^^) ... dije "Deseo", y no es un deseo muy plausible
Olivier Dulac
1
@DocSalvager, ¿puede dar un ejemplo de un error lógico que ayudaría a prevenir? Me cuesta verlo ...
Comodín el
2
@DocSalvager, en realidad no usaría el código tal como lo escribí, fue una ilustración. Sin embargo, sin la última línea (la cláusula else) la usaría de esa manera. (Para "si esto y esto, entonces haz eso" this && this2 && thatestá bien, pero para una elsecláusula usaría un real if then else fi.)
Comodín el