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