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