Por que as novas linhas incorporadas na expansão de comando são substituídas por espaços em branco?

1

Do manual do Bash sobre o resultado da expansão do comando

Embedded newlines are not deleted, but they may be removed during word splitting.

Por exemplo

$ cat myfile
1
2
3

$ echo $(cat myfile)
1 2 3

Eu me pergunto por que novas linhas incorporadas são substituídas por espaços em branco? O manual não diz isso, não é?

    
por Tim 06.03.2016 / 09:26

2 respostas

3

No bash (e em muitos outros shells), $() é usado para obter a saída de um comando e usá-lo como os argumentos de outro comando.

Aqui, o que acontece é:

Primeiro execute cat :

1
2
3

Em seguida, substitua o bloco $() por:

echo 1
2
3

Agora, o shell precisa interpretar essa entrada e enviar argumentos corretos para echo . Para isso, deve dividir 1 , 2 e 3 em palavras: é aqui que as novas linhas são removidas.

Finalmente, o shell envia o seguinte:

Programa: echo

Argumentos: 1 2 3

Isso exibirá o que você viu:

1 2 3

Porque quando echo tem vários argumentos, exibe todos eles separados por espaço.

    
por 06.03.2016 / 12:32
2

O bew78 respondeu à pergunta, mas apenas para torná-la mais explícita -

Começando com substituição de comandos no código-fonte, ele chama word_list_split () , que em si chama word_split () , que então chama list_string () , que especificamente ignora os separadores IFS. Isso cria "palavras" separadas que a função list_string () retorna à pilha. É assim que 1, 2 e 3 terminam como parâmetros separados para o comando echo .

    
por 07.03.2016 / 15:59

Tags