Por que 'echo $(cat/path/to/fileName)' lista meus arquivos e direções?

Por que 'echo $(cat/path/to/fileName)' lista meus arquivos e direções?

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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 -fou setopt noglob) ou o cite/escapa: "*" \*. Para saída de comando, é sempre melhor usar aspas.

informação relacionada