Por que 'echo $ (cat / path / to / fileName)' lista meus arquivos e pastas?


1

Estou trabalhando em um processamento de texto para fornecer uma resposta para a pergunta do usuário no Au. Quando quero imprimir o conteúdo do arquivo echo $(cat /path/to/filename), ele também lista meus arquivos e pastas. Mas quando eu tento printf "$(cat /path/to/filename)\n", 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 imprimi-lo echo $content, mas obtive o mesmo resultado errado (listar arquivos e pastas).

Eu quero armazenar o conteúdo do arquivo na variável e passar a variável para o meu script como uma entrada para o próximo comando.

Observe que o conteúdo do meu arquivo tem *caráter.

Por favor, veja os exemplos:

kasiya@kasiya-pc:~$ cat ~/test
*Hello World!*
kasiya@kasiya-pc:~$ echo $(cat ~/test)
*Hello World!*
------------------------------------------------------------------------------------------------------------------------------------------------------------
kasiya@kasiya-pc:~$ cat ~/test
*
Hello World!*
kasiya@kasiya-pc:~$ echo $(cat ~/test)
Desktop Documents Downloads Music Pictures Public Templates test Videos Hello World!*
------------------------------------------------------------------------^^^^^^^^^^^^^------------------------------------------------------------------------
kasiya@kasiya-pc:~$ cat ~/test
*Hello World!
*
kasiya@kasiya-pc:~$ echo $(cat ~/test)
*Hello World! Desktop Documents Downloads Music Pictures Public Templates test Videos
^^^^^^^^^^^^^-----------------------------------------------------------------------------------------------------------------------------------------------
kasiya@kasiya-pc:~$ cat ~/test
*
Hello World!
*
kasiya@kasiya-pc:~$ echo $(cat ~/test)
Desktop Documents Downloads Music Pictures Public Templates test Videos Hello World! Desktop Documents Downloads Music Pictures Public Templates test Videos
------------------------------------------------------------------------^^^^^^^^^^^^------------------------------------------------------------------------

Fantástico

kasiya@kasiya-pc:~$ cat ~/test
*
kasiya@kasiya-pc:~$ echo $(cat ~/test)
Desktop Documents Downloads Music Pictures Public Templates test Videos

Então cada um *no meu arquivo faz com que eu liste meus arquivos e pastas. Então, como evito isso?

Respostas:


6

Porque, após executar a substituição de comando, o shell realiza a divisão de palavras (ou divisão de campos) no resultado, se você não as citar.

A POSIX definiu a expansão de palavras como:

A ordem da expansão da palavra deve ser a seguinte:

  1. Expansão de til (consulte Expansão de til), expansão de parâmetro (consulte Expansão de parâmetro), substituição de comando (consulte Substituição de comando) e expansão aritmética (consulte Expansão aritmética) devem ser executadas, do início ao fim. Veja o item 5 em Reconhecimento de token.

  2. A divisão de campo (consulte Divisão de campo) deve ser realizada nas partes dos campos gerados pela etapa 1, a menos que o IFS seja nulo .

  3. A expansão do nome do caminho (consulte Expansão do nome do caminho) deve ser executada, a menos que o conjunto -f esteja em vigor.

  4. A remoção de cotação (consulte Remoção de cotação) deve sempre ser realizada por último.

No seu caso, *corresponde a tudo no diretório de trabalho atual. Você deve citar o resultado para obter a saída esperada:

echo "$(cat /path/to/fileName)"

2

Cite-o:

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

A nua *vai ser ampliado em bash, a menos que você desligue englobamento ( set -fou setopt noglob) ou orçamento / fugir dela: "*" \*. Para saída de comando, é sempre melhor usar aspas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.