Onde estão as continuações da linha de base após && e || documentado?

28

Eu já vi esse construto em scripts e o usei muito, mas me incomoda que eu não consiga encontrá-lo na documentação.

Exemplo:

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

Isso também pode ser feito com barras invertidas antes das novas linhas, conforme mencionado em 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).

Exemplo:

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

... mas isso não parece ser necessário. A primeira versão acima funciona mesmo sem as barras invertidas.

Onde posso encontrar isso man bash? (Além disso, isso é bashespecífico ou compatível com POSIX?)

Curinga
fonte
Se você está procurando documentação oficial do bash ou POSIX, consulte a resposta de Gilles. Mas isso é discutido em Quais são os operadores de controle e redirecionamento do shell? - Mais observações sobre ;, &, (e) .
G-Man diz 'Reinstate Monica'
@ G-Man, acho que isso não foi direcionado para mim? Apenas para futuros leitores? Como eu disse na pergunta, "me incomoda que eu não consiga encontrá-lo na documentação". Eu já sabia como isso funcionava, então isso era apenas um pedido da documentação oficial. :)
Curinga
Mesmo no caso de matrizes, há uma continuação de linha implícita: names=( Rama Soma<newline> Sita Diya ). O Python os descreve claramente aqui, mas a documentação do Bash não parece.
jamadagni

Respostas:

39

Uma nova linha é ignorada em alguns contextos em que há manifestamente um comando não terminado. Estes contextos incluem depois de um operador de controle ( &&, ||, |, &, ;, ;;, mas não !).

Não vejo isso documentado no manual do bash.

No POSIX, é especificado através das regras gramaticais . Onde quer que as regras existam linebreak, você pode ter zero ou mais quebras de linha.

Gilles 'SO- parar de ser mau'
fonte
+1, eu não sabia que funcionava para o pipe simples (|). Eu gostaria que pudéssemos colocá-los na próxima linha, para facilitar a leitura, mas não funciona dessa maneira (se você fizer isso, precisará adotar a nova linha anterior).
Olivier Dulac
1
@OlivierDulac Como isso poderia funcionar? Quando está processando a linha de comando atual, como é possível saber que você está planejando digitar |no início da próxima linha? Lembre-se, o shell também é usado interativamente, não apenas em scripts, e a gramática é a mesma.
Barmar
@Barmar: Eu sei, eu sei disso (escreveu compiladores na escola ^^) ... Eu disse: "Eu desejo", e não é um desejo muito plausível
Olivier Dulac
1
@ DocSalvager, você pode dar um exemplo de um bug lógico que ajudaria a evitar? Eu tenho um tempo difícil vê-lo ....
Wildcard
2
@ DocSalvager, eu realmente não usaria o código como o escrevi - era uma ilustração. Sem a última linha (a cláusula else), eu usaria dessa maneira. (Para "se este e este, em seguida, fazer isso" this && this2 && thaté bom, mas para uma elsecláusula que eu usaria um real if then else fi.)
Wildcard