Existe uma maneira de fazer com que o bash não coma novas linhas na substituição do backtick?
Por exemplo:
var=`echo line one && echo line two`
echo $var
line one line two
O que eu quero é
var=`echo line one && echo line two` # plus some magic
echo $var
line one
line two
bash
expansão executa parâmetros antes de executar um comando, citando é necessário informarbash
que você deseja imprimir uma única seqüência e não 4 palavras (line
,one
,line
etwo
). Tente:echo a <many spaces> b
eecho "a <many spaces> b"
. Veja também esta resposta .Mesmo que o @cyrus esteja correto - ele não responde a toda a pergunta e não há explicação do que está acontecendo.
Então, vamos percorrer isso.
Novas linhas na string
Primeiro, determine a sequência de bytes esperada:
Agora, use Substituição de Comando (Seção 3.5.4) para tentar capturar esta sequência de bytes:
Em seguida, faça um eco simples para verificar a sequência de bytes:
Parece que a primeira nova linha foi substituída por um espaço e a segunda nova linha foi deixada intacta. Mas por que ?
Vamos analisar o que realmente está acontecendo aqui:
Primeiro, o bash fará a expansão dos parâmetros do shell (Seção 3.5.3)
Então o bash fará a Divisão de Palavras (Seção 3.5.7)
Em seguida, o bash o tratará como um comando simples (Seção 3.2.1)
A definição de espaços em branco (Seção 2 - Definições)
Por fim, o bash chama o comando interno echo (Seção 4.2 - Comandos internos do bash)
Então, para resumir, as novas linhas são removidas pela Divisão de Palavras e, em seguida, o echo obtém 2 argumentos, "a" e "b" e os gera separados por espaços e terminando com uma nova linha.
Fazendo o que o @cyrus sugeriu (e suprima a nova linha do eco com -n), o resultado é melhor:
Novas linhas no final da string
Ainda não é perfeito, a nova linha se foi. Olhando mais de perto a Substituição de Comando (Seção 3.5.4) :
Agora que está claro por que a nova linha vai embora, o bash pode ser enganado para mantê-la. Para fazer isso, adicione uma sequência adicional ao final e remova-a ao usar a variável:
TL; DR
Adicione parte extra ao final da saída e cite variáveis:
fonte
Eu colocaria minha pequena adição em um comentário sobre a resposta do cYrus, mas ainda não posso comentar sobre as respostas que acho. Então, duplicarei parte da resposta de CYrus por completude.
O que acontece na primeira linha do seu código é que, de fato, a substituição de backticks consome as novas linhas finais da saída do comando substituído, conforme documentado . Mas não consome a nova linha entre suas duas linhas.
O que acontece na segunda linha de código é que o eco é executado com dois argumentos, a primeira e a segunda linha. A citação da variável expandida corrigirá isso:
echo "$var"
Isso preservará a nova linha entre a linha um e a linha dois. Eecho
adicionará uma nova linha à direita por padrão, para que tudo esteja bem.Agora, se você deseja preservar todas as novas linhas à direita na saída de alguma substituição de comando, uma solução alternativa é adicionar outra linha à saída, que você pode remover após a substituição do comando, veja aqui .
fonte