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 sobre o Au. Quando eu quero tentar imprimir o conteúdo do arquivo por echo $(cat /path/to/filename) , liste meus arquivos e pastas também. Mas quando eu tento com printf "$(cat /path/to/filename)\n" , funciona bem.

Eu tentei também salvá-lo em uma variável content='cat /path/to/filename' (também content=$(cat /path/to/filename ) e depois imprimir em echo $content , mas obtive o mesmo resultado errado (listar arquivos e pastas).

Eu quero armazenar o conteúdo do arquivo em 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 * caractere nele.

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

Em seguida, cada * no meu arquivo fará com que meus arquivos e pastas sejam listados. Então, como faço para evitar isso?

    
por αғsнιη 07.10.2014 / 11:36

2 respostas

6

Porque depois de executar a substituição de comandos, o shell executa a divisão de palavras (ou divisão de campos) no resultado, se você não as citar.

POSIX definido expansão de palavras como:

  

A ordem da expansão de palavras 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),   expansão aritmética (ver Expansão Aritmética) deve ser   realizado, do começo ao fim. Veja item 5 em Token Recognition.

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

  4.   
  5. Expansão do nome do caminho (consulte Expansão do nome do caminho) deve ser executada, a menos que a opção -f esteja em vigor.

  6.   
  7. A remoção de cotação (consulte Remoção de cotação) sempre será realizada por último.

  8.   

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

echo "$(cat /path/to/fileName)"
    
por cuonglm 07.10.2014 / 11:44
2

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 de comandos.

O * nulo será expandido em bash , a menos que você desative a globulação ( set -f ou setopt noglob ) ou cite / escape: "*" \* . Para a saída do comando, é sempre melhor usar aspas.

    
por muru 07.10.2014 / 11:39