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 / 08: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 / 11: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 / 14:59

Tags

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warning – yii\base\ErrorException

PHP Startup: Unable to load dynamic library 'memcached.so' (tried: /usr/lib/php/20190902/memcached.so (/usr/lib/php/20190902/memcached.so: undefined symbol: igbinary_serialize), /usr/lib/php/20190902/memcached.so.so (/usr/lib/php/20190902/memcached.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '839575',
    'url' => 'why-are-embedded-newlines-in-command-expansion-replaced-with-whitespaces',
];

$_COOKIE = [
    'advanced-frontend' => '54alkhdgfklr5rmd04npl8ht68',
    '_csrf-frontend' => '8a99125bb8e294d5e9d7de2779c80f16dc1e2330aab4ba93036d70bd665b17a9a:2:{i:0;s:14:"_csrf-frontend";i:1;s:32:"VdHHl8CkupbJcLHu-HzefwPjYlzysGtB";}',
];

$_SESSION = [
    '__flash' => [],
];