Redirection du contenu d'un fichier vers la commande "echo"

41

J'ai un fichier nommé my_file.txtdont le contenu est juste la chaîne Hello. Comment pourrais-je rediriger son contenu vers la commande echo?

Je sais que j'ai les commandes less, cat, more... mais je dois le faire avec echo.

J'ai essayé ceci:

$ cat my_file.txt | echo

et aussi ceci:

$ echo < my_file.txt

Mais dans les deux cas, il apparaît uniquement un blanc dans la sortie standard, pas le contenu de my_file.txt.

Comment pourrais-je faire ça?

danielmbcn
la source
7
Pourquoi insistez-vous pour utiliser echo?
Kevin
7
@ Kevin, probablement par la suite, il souhaite développer les séquences d'échappement ANSI C ( \n, b...) dans le fichier, ce qui constituerait un usage valide de echo(au moins un standard echo). Ou vraisemblablement, il veut comprendre pourquoi cela ne fonctionne pas ainsi. En tout état de cause, aucune raison de réduire l’OMI.
Stéphane Chazelas
3
Je suis venu ici parce que j'étais curieux de savoir pourquoi cela ne fonctionne pas alors que je répète <fichier.txt. Semble une question raisonnable à avoir chez SE, la réponse a été très utile. +1 de moi.
neuronet

Réponses:

53

Vous pouvez rediriger tout ce que vous voulez, echomais cela ne fera rien. echone lit pas son entrée standard. Tout ce qu'il fait est d'écrire dans la sortie standard ses arguments séparés par un caractère d'espacement et terminés par un caractère de nouvelle ligne (et avec certaines echoimplémentations contenant des séquences d'échappement développées et / ou des arguments commençant par -éventuellement traités comme des options).

Si vous souhaitez echoafficher le contenu d'un fichier, vous devez transmettre ce contenu en tant qu'argument echo. Quelque chose comme:

echo "$(cat my_file.txt)"

Notez que des $(...)bandes le caractère de nouvelle ligne de fuite s de la sortie de cette catcommande, et echoajoute un retour.

Notez également que, sauf avec zsh, vous ne pouvez pas transmettre de caractères NUL dans les arguments d'une commande, de sorte que l'opération ci-dessus ne fonctionnera généralement pas avec les fichiers binaires. yashsupprimera également les octets qui ne font pas partie des caractères valides.

Si la raison de vouloir le faire parce que vous voulez echoà étendre \n, \b, \0351... des séquences d'échappement dans le fichier (comme UNIX conforme à l ' echoimplémentations font, mais pas tous ), alors vous préférez utiliser à la printfplace :

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

Contrairement à echo, celui-ci est portable et n'aura pas de problèmes si le contenu du fichier commence par -.


Comme alternative à $(cat file), avec ksh, zshet bash, on peut aussi le faire:$(<file) . C'est un opérateur spécial dans lequel le shell, par opposition à, catlit le contenu du fichier pour constituer l'extension. Il supprime toujours les sauts de ligne et les indentations de fin sur les octets NUL sauf dans zsh. En bash, cela impose encore un processus supplémentaire. Notez également qu'une différence est que vous n'obtiendrez aucune erreur si vous essayez de lire un fichier de type répertoire de cette façon. En outre, while $(< file)est spécial, $(< file; other command)non (dans le cas zshoù, sans émuler un autre shell, le contenu de la bibliothèque serait développé file, en exécutant la commande implicite $READNULLCMD (généralement un pager)).

Stéphane Chazelas
la source
3
Dans les deux bash et zsh , vous pouvez sauter le catet juste la coquille lire directement: echo "$(<my_file.txt)".
Kevin
1
Oui, vous pouvez utiliser ksh , zsh et bash$(<filename) .
Dimitre Radoulov
Merci beaucoup, c'est ce dont j'avais besoin et cela a fonctionné! :-)
danielmbcn
@ Kevin, Dimitre, ajouté maintenant.
Stéphane Chazelas
4

En ajoutant à d’autres réponses, vous pouvez également essayer la redirection d’entrée au lieu de cat

echo $(<my_file.txt)

ou

echo `<my_file.txt`

$()et `` effectue la même chose, ils exécutent des commandes à l'intérieur de leur portée et donnent la sortie au shell comme si elle avait été donnée en entrée par l'utilisateur. La seule différence entre les deux est que $ () peut être récursif et `` ne peut pas être récursif.

GypsyCosmonaut
la source
2

Réponse simple: vous ne pouvez pas. echo(que ce soit du shell intégré ou du binaire normal) ne traite pas son entrée standard - c’est à sens unique.

Peterph
la source
La question est, pourquoi voudriez-vous réellement faire cela?
Peter
2

Comme il a été dit,

Si vous souhaitez echoafficher le contenu d'un fichier, vous devez passer ce contenu sous forme d'argument àecho

Par exemple, vous pouvez le faire comme ceci xargs(compte tenu du fait que vous devez activer l'interprétation des échappements de barre oblique inversée ):

$ cat my_file.txt | xargs echo -e

Ou simplement ce que vous avez demandé (sans interprétation des séquences d'échappement ):

$ cat my_file.txt | xargs echo
kenichi
la source
Notez cependant que lors de l'utilisation xargs echo(identique à xargsbtw en tant que echocommande par défaut), c'est la echocommande du système de fichiers qui sera exécutée, et non la echocommande intégrée du shell . Notez également que xargssa saisie est attendue dans un format très spécifique (où les espaces, les nouvelles lignes, les guillemets, les barres obliques inverses ont une signification particulière). catne fait pas beaucoup de sens ici car il n'y a qu'un seul fichier à concaténer (identique à < file.txt xargs echoNotez que conformes Unix. echos font l' expansion d'échappement backslash par défaut et sortie -esur echo -e.
Stéphane Chazelas
0

En bash, ce qui suit devrait également fonctionner:

echo `cat my_file.txt`

La partie dans les backticks est remplacée par la sortie de cette commande, c'est-à-dire dans ce cas remplacée par le contenu du fichier.

Motlib
la source
Certes, les backticks fonctionnent comme $( . . . ). Les personnes qui les utilisent les $()préfèrent généralement parce que vous pouvez les imbriquer. Cette question est ancienne, cependant, il est beaucoup plus satisfaisant de répondre à des questions auxquelles on ne répond pas déjà!
Law29
Pas assez. Il y a une différence subtile. Lorsque la forme de back-tick est utilisée, une barre oblique inverse conserve sa signification littérale, sauf lorsqu'elle est suivie de $, `ou \. Le premier retour arrière non précédé d'une barre oblique inverse met fin à la commande. Lorsque vous utilisez le formulaire $ (,,,), tous les caractères entre les parenthèses constituent la commande.
fpmurphy
Comme cette substitution de commande n'est pas citée, l'opérateur split + glob lui serait appliqué. Par exemple, si my_file.txtcontient *, cela imprimerait la liste des noms de fichiers dans le répertoire actuel.
Stéphane Chazelas