it-swarm.com.de

Umleiten des Inhalts einer Datei zum Befehl "echo"

Ich habe eine Datei mit dem Namen my_file.txt dessen Inhalt nur die Zeichenfolge Hello ist. Wie könnte ich seinen Inhalt auf den Befehl echo umleiten?

Ich weiß, dass ich die Befehle less, cat, more... habe, aber ich muss es mit echo tun.

Ich habe es versucht:

$ cat my_file.txt | echo

und auch das:

$ echo < my_file.txt

In beiden Fällen wird jedoch nur ein Leerzeichen im Standard angezeigt, nicht der Inhalt von my_file.txt.

Wie könnte ich das machen?

46
danielmbcn

Sie können alles umleiten, was Sie möchten echo, aber es wird nichts damit anfangen. echo liest seine Standardeingabe nicht. Alles, was es tut, ist, in die Standardausgabe seine Argumente zu schreiben, die durch ein Leerzeichen getrennt und durch ein Zeilenumbruchzeichen abgeschlossen sind (und mit einigen echo Implementierungen mit einigen Escape-Sequenzen in ihnen erweitert und/oder Argumente, die mit - beginnen und möglicherweise als Optionen behandelt werden).

Wenn Sie möchten, dass echo den Inhalt einer Datei anzeigt, müssen Sie diesen Inhalt als Argument an echo übergeben. Etwas wie:

echo "$(cat my_file.txt)"

Beachten Sie, dass $(...) das nachfolgende Zeilenumbruchzeichen entfernts von der Ausgabe dieses cat Befehls und echo fügt einen zurück.

Beachten Sie auch, dass Sie mit Ausnahme von zsh keine NUL-Zeichen in den Argumenten eines Befehls übergeben können, sodass das oben Gesagte normalerweise nicht mit Binärdateien funktioniert. yash entfernt auch Bytes, die nicht Teil gültiger Zeichen sind.

Wenn der Grund dafür darin besteht, dass echo die Escape-Sequenzen \n, \b, \0351 ... in der Datei erweitern soll (wie es UNIX-konforme echo Implementierungen tun, aber nicht alle ), dann Sie möchten stattdessen lieber printf verwenden :

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

Im Gegensatz zu echo ist dieses portabel und hat keine Probleme, wenn der Inhalt der Datei mit - Beginnt.


Alternativ zu $(cat file), mit ksh, zsh und bash kann man auch Folgendes tun: $(<file) . Dies ist ein spezieller Operator, bei dem die Shell Im Gegensatz zu cat den Inhalt der Datei liest, um die Erweiterung zu bilden. Es werden immer noch die nachfolgenden Zeilenumbrüche und Drosseln auf NUL-Bytes entfernt, außer in zsh. In bash führt dies immer noch zu einem zusätzlichen Prozess. Beachten Sie auch, dass ein Unterschied darin besteht, dass Sie keine Fehler erhalten, wenn Sie versuchen, eine Datei vom Typ Verzeichnis auf diese Weise zu lesen. Auch wenn $(< file) etwas Besonderes ist, ist $(< file; other command) nicht (in zsh, wenn keine andere Shell emuliert wird, würde dies den Inhalt von file, indem der Befehl implizit$READNULLCMD ausgeführt wird (normalerweise ein Pager).

60

Wenn Sie andere Antworten hinzufügen, können Sie auch versuchen, die Eingabe umzuleiten, anstatt cat

echo $(<my_file.txt)

oder

echo `<my_file.txt`

$() und `` führen dasselbe aus, sie führen Befehle innerhalb ihres Bereichs aus und geben die Ausgabe an die Shell weiter, als ob sie vom Benutzer als Eingabe angegeben worden wäre. Der einzige Unterschied zwischen diesen beiden besteht darin, dass $ () rekursiv sein kann und `` nicht rekursiv sein kann.

4
GypsyCosmonaut

Wie gesagt wurde,

Wenn echo den Inhalt einer Datei anzeigen soll, müssen Sie diesen Inhalt als Argument an echo übergeben

Zum Beispiel können Sie dies mit xargs so tun (wenn Sie bedenken, dass Sie die Interpretation von Backslash-Escapezeichen aktivieren müssen):

$ cat my_file.txt | xargs echo -e

Oder einfach, was Sie gefragt haben (ohne Interpretation von entgeht Sequenzen ):

$ cat my_file.txt | xargs echo
2
kenichi

Einfache Antwort: Sie können nicht. echo (sei es Shell-integrierte oder reguläre Binärdatei) verarbeitet seine Standardeingabe nicht - es ist nur eine Möglichkeit.

2
peterph

In Bash sollte auch Folgendes funktionieren:

echo `cat my_file.txt`

Der Teil in Backticks wird durch die Ausgabe dieses Befehls ersetzt, d. H. In diesem Fall durch den Dateiinhalt.

0
Motlib