Redirecionando o conteúdo de um arquivo para o comando “echo”

31

Eu tenho um arquivo chamado my_file.txt cujo conteúdo é apenas a string Hello . Como eu poderia redirecionar seu conteúdo para o comando echo ?

Eu sei que tenho os comandos less , cat , more ... mas preciso fazer isso com echo .

Eu tentei isso:

$ cat my_file.txt | echo

e também isso:

$ echo < my_file.txt

Mas em ambos os casos, aparece apenas um espaço em branco no stdout, não o conteúdo do meu_arquivo.txt.

Como eu poderia fazer isso?

Agradecemos antecipadamente: -)

    
por danielmbcn 04.02.2013 / 15:20

5 respostas

42

Você pode redirecionar tudo que quiser para echo , mas não fará nada com isso. echo não lê sua entrada padrão. Tudo o que faz é gravar na saída padrão seus argumentos separados por um caractere de espaço e terminados por um caractere de nova linha (e com algumas implementações echo com algumas seqüências de escape neles expandidas e / ou argumentos começando com - possivelmente tratado como opções).

Se você quiser que echo exiba o conteúdo de um arquivo, terá que passar esse conteúdo como um argumento para echo . Algo como:

echo "$(cat my_file.txt)"

Observe que $(...) retira o caractere de nova linha à direita s da saída desse comando cat e echo adiciona um de volta.

Observe também que, exceto com zsh , você não pode passar caracteres NUL nos argumentos de um comando, de modo que, acima disso, normalmente não funcionará com arquivos binários. yash também removerá bytes que não fazem parte de caracteres válidos.

Se o motivo de querer fazer isso é porque você deseja que echo expanda as seqüências de escape \n , \b , 51 ... no arquivo (como UNIX coformande echo implementations, mas não todos ), então você prefere usar printf :

printf '%b\n' "$(cat my_file.txt)"

Ao contrário de echo , esse é portátil e não terá problemas se o conteúdo do arquivo começar com - .

Como uma alternativa a $(cat file) , com ksh , zsh e bash , também é possível fazer: $(<file) . Esse é um operador especial pelo qual o shell , em oposição a cat , lê o conteúdo do arquivo para compor a expansão. Ele ainda retira as novas linhas finais e bloqueia em bytes NUL, exceto em zsh . Em bash , isso ainda cria um processo extra. Observe também que uma diferença é que você não obterá nenhum erro se tentar ler um arquivo do tipo directory dessa forma. Além disso, embora $(< file) seja especial, $(< file; other command) não é (em zsh , quando não emular outro shell, que ainda expandiria o conteúdo do file , executando o implícito % Comando$READNULLCMD (tipicamente um pager)).

    
por 04.02.2013 / 15:41
2

Resposta simples: você não pode. echo (seja shell interno ou binário regular) não processa sua entrada padrão - é apenas uma maneira.

    
por 04.02.2013 / 15:27
2

Como foi dito,

If you want echo to display the content of a file, you have to pass that content as an argument to echo

Por exemplo, você pode fazer isso com xargs (considerando que você precisa ativar a interpretação de escapes de barra invertida ):

$ cat my_file.txt | xargs echo -e

Ou simplesmente o que você pediu (sem interpretação de escapa sequências ):

$ cat my_file.txt | xargs echo
    
por 01.07.2016 / 08:53
2

Adicionando a outras respostas, você também pode tentar redirecionar a entrada em vez de cat

echo $(<my_file.txt)

ou

echo '<my_file.txt'

$() e '' executam a mesma coisa, eles executam comandos dentro de seu escopo e fornecem a saída para o shell como se fosse dado como uma entrada pelo usuário. A única diferença entre esses dois é que $ () pode ser recursivo e '' não pode ser recursivo.

    
por 08.05.2017 / 12:30
0

No bash, o seguinte também deve funcionar:

echo 'cat my_file.txt'

A parte nos backticks é substituída pela saída desse comando, ou seja, neste caso, substituída pelo conteúdo do arquivo.

    
por 01.07.2016 / 11:03