Se eu tiver o arquivo que input.txt
contém:
hello
world
!
A execução do comando bash echo $(cat input.txt)
produzirá o seguinte:
hello world !
Por que e como posso corrigi-lo para gerar exatamente o que está no arquivo, como está no arquivo?
Se eu tiver o arquivo que input.txt
contém:
hello
world
!
A execução do comando bash echo $(cat input.txt)
produzirá o seguinte:
hello world !
Por que e como posso corrigi-lo para gerar exatamente o que está no arquivo, como está no arquivo?
Respostas:
Se você usar
echo "$(cat input.txt)"
funcionará corretamente.
Provavelmente, a entrada de eco é separada por novas linhas, e será tratada como comandos separados, portanto o resultado será sem novas linhas.
echo "$(date) something"
retirar a nova linha à direita da saída da data, tornando esse eco a saída da data e "algo" na mesma linha. Se você precisar armazenar um arquivo ou saída de comando "como está", use mapfile ( help mapfile
) read -rd ''
ou um loop de leitura while.
Citado na página do manual do bash, seção Command Substitution
:
As novas linhas incorporadas não são excluídas, mas podem ser removidas durante a divisão de palavras.
Um pouco mais, mesma seção:
Se a substituição aparecer entre aspas duplas, a divisão de palavras e a expansão do nome do caminho não são executadas nos resultados.
É por isso que echo "$(cat /etc/passwd)"
funciona.
Além disso, é preciso estar ciente de que a substituição de comandos pelas especificações POSIX remove as novas linhas finais:
$ echo "$(printf "one\ntwo\n\n\n")"
one
two
Portanto, a saída de um arquivo via $(cat file.txt)
pode levar à perda de novas linhas finais, e isso pode ser um problema se a integridade total do arquivo for prioritária.
Você pode preservar novas linhas, por exemplo, configurando o IFS para vazio:
$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3