Quando imprimo o conteúdo de um arquivo com echo $(cat /path/to/filename)
, ele lista meus arquivos e instruções também. Mas quando eu faço printf "$(cat /path/to/filename)\n"
isso funciona bem.
Tentei também salvá-lo em uma variável content='cat /path/to/filename'
(também content=$(cat /path/to/filename
) e depois imprimir por echo $content
, mas obtive o mesmo resultado (listar arquivos e instruções).
Quero armazenar o conteúdo do arquivo em uma variável e passar a variável para o meu script como entrada para o próximo comando.
Observe que o conteúdo do meu arquivo possui caracteres especiais *
.
Responder1
Porque depois de realizar a substituição de comandos, o shell executa a divisão de palavras (ou divisão de campos) no resultado, se você não os citar.
POSIX definidoexpansão de palavrascomo:
A ordem de expansão das palavras será a seguinte:
A expansão de til (consulte Expansão de til), a expansão de parâmetros (consulte Expansão de parâmetros), a substituição de comandos (consulte Substituição de comandos) e a expansão aritmética (consulte Expansão aritmética) devem ser executadas, do início ao fim. Consulte o item 5 em Reconhecimento de Token.
A divisão de campos (ver Divisão de Campos) deve ser realizada nas partes dos campos gerados na etapa 1, a menos que IFS seja nulo.
A expansão do nome do caminho (consulte Expansão do nome do caminho) deve ser executada, a menos que set -f esteja em vigor.
A remoção de cotação (ver Remoção de cotação) será sempre realizada por último.
No seu caso, *
corresponda a tudo no diretório de trabalho atual. Você deve citar o resultado para obter a saída esperada:
echo "$(cat /path/to/fileName)"
Responder2
Cite:
$ echo "*" >> test
$ echo $(cat test)
bash43-001 bash43-002 bash43-003 bash43-004 bash43-005 test
$ echo "$(cat test)"
*
Como primeira regra, sempre cite a substituição do comando.
O vazio *
será expandido em bash
, a menos que você desative o globbing ( set -f
ou setopt noglob
) ou o cite/escapa: "*" \*
. Para saída de comando, é sempre melhor usar aspas.