J'ai un fichier nommé my_file.txt
dont 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?
shell
io-redirection
echo
danielmbcn
la source
la source
echo
?\n
,b
...) dans le fichier, ce qui constituerait un usage valide deecho
(au moins un standardecho
). Ou vraisemblablement, il veut comprendre pourquoi cela ne fonctionne pas ainsi. En tout état de cause, aucune raison de réduire l’OMI.Réponses:
Vous pouvez rediriger tout ce que vous voulez,
echo
mais cela ne fera rien.echo
ne 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 certainesecho
implé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
echo
afficher le contenu d'un fichier, vous devez transmettre ce contenu en tant qu'argumentecho
. Quelque chose comme:Notez que des
$(...)
bandes le caractère de nouvelle ligne de fuite s de la sortie de cettecat
commande, etecho
ajoute 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.yash
supprimera é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 'echo
implémentations font, mais pas tous ), alors vous préférez utiliser à laprintf
place :Contrairement à
echo
, celui-ci est portable et n'aura pas de problèmes si le contenu du fichier commence par-
.Comme alternative à
$(cat file)
, avecksh
,zsh
etbash
, on peut aussi le faire:$(<file)
. C'est un opérateur spécial dans lequel le shell, par opposition à,cat
lit 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 danszsh
. Enbash
, 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 caszsh
où, 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)).la source
cat
et juste la coquille lire directement:echo "$(<my_file.txt)"
.$(<filename)
.En ajoutant à d’autres réponses, vous pouvez également essayer la redirection d’entrée au lieu de
cat
ou
$()
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.la source
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.la source
Comme il a été dit,
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 ):Ou simplement ce que vous avez demandé (sans interprétation des séquences d'échappement ):
la source
xargs echo
(identique àxargs
btw en tant queecho
commande par défaut), c'est laecho
commande du système de fichiers qui sera exécutée, et non laecho
commande intégrée du shell . Notez également quexargs
sa 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).cat
ne fait pas beaucoup de sens ici car il n'y a qu'un seul fichier à concaténer (identique à< file.txt xargs echo
Notez que conformes Unix.echo
s font l' expansion d'échappement backslash par défaut et sortie-e
surecho -e
.En bash, ce qui suit devrait également fonctionner:
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.
la source
$( . . . )
. 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à!my_file.txt
contient*
, cela imprimerait la liste des noms de fichiers dans le répertoire actuel.