web-dev-qa-db-fra.com

Rediriger le contenu d'un fichier vers la commande "echo"

J'ai un fichier nommé my_file.txt dont le contenu n'est que 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 n'apparaît que dans la stdout, pas dans le contenu de my_file.txt.

Comment pourrais-je faire ça?

46
danielmbcn

Vous pouvez rediriger tout ce que vous voulez vers echo mais cela ne fera rien avec. echo ne lit pas son entrée standard. Tout ce qu'il fait est d'écrire sur la sortie standard ses arguments séparés par un caractère espace et terminés par un caractère de nouvelle ligne (et avec certaines implémentations echo avec quelques séquences d'échappement en eux développées et/ou des arguments commençant par - éventuellement traités comme des options).

Si vous voulez que echo affiche le contenu d'un fichier, vous devez passer ce contenu comme argument à echo. Quelque chose comme:

echo "$(cat my_file.txt)"

Notez que $(...) supprime le caractère de fin de lignes à partir de la sortie de cette commande cat et echo en ajoute une en arrière.

Notez également qu'à l'exception de zsh, vous ne pouvez pas passer de caractères NUL dans les arguments d'une commande, de sorte que ci-dessus ne fonctionnera généralement pas avec les fichiers binaires. yash supprimera également les octets qui ne font pas partie des caractères valides.

Si vous voulez le faire, c'est parce que vous voulez que echo développe les séquences d'échappement \n, \b, \0351 ... dans le fichier ( comme le font les implémentations echo conformes à UNIX, mais pas toutes ), puis vous préférez utiliser printf à la place :

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, zsh et bash, on peut aussi faire: $(<file) . C'est un opérateur spécial par lequel le Shell par opposition à cat lit le contenu du fichier pour constituer l'expansion. Il supprime toujours les sauts de ligne et les étranglements sur les octets NUL, sauf dans zsh. Dans bash, cela entraîne toujours 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. De plus, alors que $(< file) est spécial, $(< file; other command) ne l'est pas (dans zsh, lorsqu'il n'émule pas d'autres Shell, cela étendrait encore le contenu du file, en exécutant la commande implicite$READNULLCMD (généralement un pager)).

60
Stéphane Chazelas

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 `` effectuent 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 ces deux est que $ () peut être récursif et `` ne peut pas être récursif.

4
GypsyCosmonaut

Comme il a été dit,

Si vous voulez que echo affiche le contenu d'un fichier, vous devez passer ce contenu en argument à echo

Par exemple, vous pouvez le faire comme ceci avec xargs (en considérant que vous devez activer l'interprétation de échappements antislash):

$ cat my_file.txt | xargs echo -e

Ou tout simplement ce que vous avez demandé (sans interprétation de échappe les séquences):

$ cat my_file.txt | xargs echo
2
kenichi

Réponse simple: vous ne pouvez pas. echo (qu'il soit intégré à Shell ou binaire normal) ne traite pas son entrée standard - c'est une seule façon.

2
peterph

En bash, les éléments suivants devraient également fonctionner:

echo `cat my_file.txt`

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

0
Motlib