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 eu preciso fazê-lo com echo
.
Eu tentei isso:
$ cat my_file.txt | echo
e também isso:
$ echo < my_file.txt
Mas nos dois casos, ele aparece apenas em branco no stdout, não no conteúdo do meu_arquivo.txt.
Como eu pude fazer isso?
shell
io-redirection
echo
danielmbcn
fonte
fonte
echo
?\n
,b
...) no arquivo, o que seria um uso válido deecho
(pelo menos um padrãoecho
). Ou, presumivelmente, ele quer entender por que não funciona dessa maneira. Em qualquer caso, não há razão para fazer voto negativo na IMO.Respostas:
Você pode redirecionar tudo o que quiser,
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 finalizados por um caractere de nova linha (e com algumasecho
implementações com algumas seqüências de escape nelas expandidas e / ou argumentos iniciados com-
possivelmente tratados como opções).Se você deseja
echo
exibir o conteúdo de um arquivo, deve passar esse conteúdo como argumentoecho
. Algo como:Note-se que
$(...)
retira o caractere de nova linha de fuga s da saída dessecat
comando, eecho
acrescenta uma volta.Observe também que, exceto com
zsh
, você não pode passar caracteres NUL nos argumentos de um comando, portanto, acima, normalmente, não funcionará com arquivos binários.yash
também removerá bytes que não fazem parte de caracteres válidos.Se a razão para querer fazer isso é porque você quer
echo
para expandir o\n
,\b
,\0351
... sequências de escape no arquivo (como conformant UNIXecho
implementações fazer, mas não todos ), então você preferir usarprintf
vez :Ao contrário
echo
, esse é portátil e não terá problemas se o conteúdo do arquivo começar-
.Como uma alternativa para
$(cat file)
, comksh
,zsh
ebash
, pode-se também fazer:$(<file)
. Esse é um operador especial pelo qual o shell, em vez decat
ler o conteúdo do arquivo, compõe a expansão. Ele ainda retira as novas linhas finais e engasga com bytes NUL, exceto emzsh
. Embash
, isso ainda bifurca um processo extra. Observe também que uma diferença é que você não receberá nenhum erro se tentar ler um arquivo do tipo diretório dessa maneira. Além disso, embora$(< file)
seja especial,$(< file; other command)
não é (emzsh
, quando não emula outro shell, que ainda expandiria o conteúdo dofile
, executando o comando implícito$READNULLCMD
(normalmente um pager)).fonte
cat
e só tem o shell lê-lo em diretamente:echo "$(<my_file.txt)"
.$(<filename)
.Além de outras respostas, você também pode tentar o redirecionamento de entrada em vez de
cat
ou
$()
e `` executam a mesma coisa, eles executam comandos dentro de seu escopo e entregam a saída para o shell como se fosse dada como entrada pelo usuário. A única diferença entre esses dois é que $ () pode ser recursivo e `` não pode ser recursivo.fonte
Resposta simples: você não pode.
echo
(seja shell interno ou binário regular) não processa sua entrada padrão - é apenas uma maneira.fonte
Como foi dito,
Por exemplo, você pode fazer assim com
xargs
(considerando que você precisa habilitar a interpretação de escapes de barra invertida ):Ou simplesmente o que você pediu (sem interpretação das seqüências de escape ):
fonte
xargs echo
(o mesmo quexargs
btw eecho
o comando padrão), é oecho
comando do sistema de arquivos que será executado, não oecho
comando interno do shell . Observe também quexargs
espera sua entrada em um formato muito específico (onde espaços em branco, novas linhas, aspas, barras invertidas têm um significado especial).cat
não faz muito sentido aqui como há apenas um arquivo para concatenar (o mesmo que< file.txt xargs echo
Note que compatíveis com Unix.echo
s fazer expansão de escape barra invertida por padrão e saída-e
em cimaecho -e
.No bash, também deve funcionar o seguinte:
A parte nos backticks é substituída pela saída desse comando, ou seja, neste caso, substituída pelo conteúdo do arquivo.
fonte
$( . . . )
. As pessoas que usam$()
geralmente preferem, porque você pode aninhar. Esta questão é antiga, porém, é muito mais gratificante responder a perguntas que ainda não foram respondidas!my_file.txt
contém*
, isso imprimiria a lista de nomes de arquivos no diretório atual.