Por que uma substituição de comando here-string é considerada como uma única linha?

2

Estou experimentando a while read syntax e há uma coisa que não entendo.

O cenário mais básico que reproduz o problema é o seguinte: um script bash a.sh chama outro script b.sh e exibe as linhas ecoadas por ele:

a.sh

#!/bin/bash

while read line; do
    echo "<<$line>>"
done <<< './b.sh'

b.sh

#!/bin/bash

echo "Hello"
echo "World"

A execução de b.sh é a esperada:

Hello
World

Por outro lado, quando executo a.sh , a saída é:

<<Hello World>>

enquanto espero que seja:

<<Hello>>
<<World>>

O que estou fazendo de errado?

    
por Arseni Mourzenko 25.10.2014 / 02:29

1 resposta

4

De o changelog de Bash entre 4.4-alpha e 4.4-beta :

[...]

This document details the changes between this version, bash-4.4-beta, and the previous version, bash-4.4-alpha.

[...]

z. Bash no longer splits the expansion of here-strings, as the documentation has always said.

Isso me parece um pouco ambíguo, mas quaisquer mudanças que tenham sido cometidas com as fontes bash naquela época tiveram o efeito de que, no Bash 4.4, o comando

while read line; do
    printf '<<%s>>\n' "$line"
done <<< $( printf '%s\n' hello world )

produzirá

<<hello>>
<<world>>

não

<<hello world>>

como no Bash 4.3.

    
por 09.09.2017 / 15:22