Como posso dividir um comando em várias linhas no shell, quando o comando faz parte de uma if
instrução?
Isso funciona:
if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1
fi
Isso não funciona:
# does not work:
if ! fab --fabfile=.deploy/fabfile.py \
--forward-agent \
--disable-known-hosts deploy:$target; then
rc=1
fi
Em vez de todo o comando em execução, recebo:
./script.sh: line 73: --forward-agent: command not found
Mais importante, o que está faltando no meu entendimento do Bash que me ajudará a entender esse e outros problemas semelhantes no futuro?
$ if ! cp -n log/server1.log \ > .; then echo no copy; fi
sem erro, com uma nova linha após\
\
? Eles são bem difíceis de ver. Se o fizer, convém verificar se é possível fazer com que seu editor remova os espaços à direita ou os torne mais visíveis.Respostas:
A continuação da linha falhará se você tiver espaços em branco (espaços ou caracteres de tabulação) após a barra invertida e antes da nova linha. Sem esse espaço em branco, seu exemplo funciona bem para mim:
Alguns detalhes promovidos a partir dos comentários: a barra invertida de continuação de linha no shell não é realmente um caso especial; é simplesmente uma instância da regra geral em que uma barra invertida "cita" o caractere imediatamente seguinte, impedindo qualquer tratamento especial ao qual normalmente estaria sujeito. Nesse caso, o próximo caractere é uma nova linha e o tratamento especial que está sendo impedido está encerrando o comando. Normalmente, um personagem citado acaba literalmente incluído no comando; uma nova linha com barra invertida é totalmente excluída. Mas, caso contrário, o mecanismo é o mesmo. E a barra invertida cita apenas o caractere imediatamente seguinte; se esse caractere for um espaço ou tab, você receberá um espaço ou tab entre aspas e qualquer nova linha subsequente permanecerá entre aspas.
fonte
`s. For example, when adding one after the first
`, eu recebo./soundops: line 73: --forward-agent: command not found
. Meu problema foi que não entendi esse erro. Por que ter um espaço em branco resulta nesse erro? O espaço em branco +\n
"nega" o `` e delimita um comando?Para usuários de Windows / WSL / Cygwin etc:
Certifique-se de que as terminações de sua linha sejam feeds de linha Unix padrão, ou seja,
\n
apenas (LF).O uso de terminações de linha do Windows
\r\n
(CRLF) interromperá a quebra de linha de comando.Isso ocorre porque
\
, ao final de uma linha com final de linha do Windows, é traduzido como\
\r
\n
.Como Mark explica corretamente acima:
Isso inclui não apenas espaço (
) ou tabulações (
\t
), mas também o retorno de carro (\r
).fonte