Ich habe eine Datei mit dem Namen, my_file.txt
deren Inhalt nur die Zeichenfolge ist Hello
. Wie kann ich den Inhalt auf den Befehl umleiten echo
?
Ich weiß , dass ich die Befehle haben less
, cat
, more
... aber ich muss es mit dem tun echo
.
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 in der stdout angezeigt, nicht der Inhalt von my_file.txt.
Wie könnte ich das machen?
shell
io-redirection
echo
danielmbcn
quelle
quelle
echo
?\n
,b
...) in der Datei erweitern, was eine gültige Verwendung vonecho
(zumindest eines Standardsecho
) wäre. Oder vermutlich will er verstehen, warum es nicht so funktioniert. In jedem Fall kein Grund, IMO abzustimmen.Antworten:
Sie können alles umleiten, was Sie wollen,
echo
aber es wird nichts damit anfangen.echo
liest seine Standardeingabe nicht. Es wird lediglich in die Standardausgabe geschrieben, wobei die Argumente durch ein Leerzeichen getrennt und durch ein Zeilenumbruchzeichen abgeschlossen werden (und bei einigenecho
Implementierungen werden einige Escape-Sequenzen darin erweitert und / oder Argumente beginnen mit-
möglicherweise als Optionen behandelten).Wenn Sie
echo
den Inhalt einer Datei anzeigen möchten , müssen Sie diesen Inhalt als Argument an übergebenecho
. So etwas wie:Beachten Sie, dass
$(...)
die hinteren Neue - Zeile - Zeichenstreifen s vom Ausgang diesescat
Befehls, undecho
fügt einen Rücken.Beachten
zsh
Sie auch, dass Sie mit Ausnahme von with keine NUL-Zeichen in den Argumenten eines Befehls übergeben können, sodass die oben genannten normalerweise nicht mit Binärdateien funktionieren.yash
entfernt auch Bytes, die nicht Teil gültiger Zeichen sind.Wenn der Grund für den Wunsch , das zu tun ist , weil Sie wollen
echo
das erweitern\n
,\b
,\0351
... Escape - Sequenzen in der Datei (wie UNIX - konformeecho
Implementierungen zu tun, aber nicht alle ), dann würden Sie lieber verwendenprintf
statt :Im Gegensatz dazu
echo
ist diese portabel und hat keine Probleme, wenn der Inhalt der Datei mit beginnt-
.Als Alternative zu
$(cat file)
, mitksh
,zsh
undbash
kann man auch tun:$(<file)
. Dies ist ein spezieller Operator, bei dem die Shell im Gegensatz zumcat
Lesen den Inhalt der Datei liest, um die Erweiterung zu bilden. Es werden weiterhin die nachgestellten Zeilenumbrüche und Drosseln auf NUL-Bytes außer in entferntzsh
. Inbash
, das gabelt noch einen zusätzlichen Prozess. Beachten Sie auch, dass ein Unterschied darin besteht, dass beim Versuch, eine Datei des Typs directory auf diese Weise zu lesen, keine Fehler auftreten. Solange$(< file)
es etwas Besonderes ist,$(< file; other command)
ist es auch nichts (zsh
wenn Sie keine andere Shell emulieren, würde dies den Inhalt der Shell trotzdem erweiternfile
, indem Sie den impliziten$READNULLCMD
Befehl ausführen (normalerweise einen Pager)).quelle
cat
und nur noch die Schale in direkt lesen:echo "$(<my_file.txt)"
.$(<filename)
.Neben anderen Antworten können Sie auch die Eingabeumleitung anstelle von verwenden
cat
oder
$()
und `` führen dasselbe aus, sie führen Befehle innerhalb ihres Gültigkeitsbereichs aus und geben die Ausgabe an die Shell weiter, als ob sie vom Benutzer als Eingabe übergeben worden wäre. Der einzige Unterschied zwischen diesen beiden ist, dass $ () rekursiv und `` nicht rekursiv sein kann.quelle
Einfache Antwort: Sie können nicht.
echo
(sei es in der Shell eingebaut oder als reguläre Binärdatei) verarbeitet die Standardeingabe nicht - es ist nur eine Möglichkeit.quelle
Wie gesagt,
Zum Beispiel können Sie dies folgendermaßen tun
xargs
(vorausgesetzt, Sie müssen die Interpretation von Backslash-Escapes aktivieren ):Oder einfach, was Sie gefragt haben (ohne Interpretation von Escape- Sequenzen ):
quelle
xargs echo
(xargs
genau wieecho
beim Standardbefehl) derecho
Befehl aus dem Dateisystem ausgeführt wird, nicht der integrierteecho
Befehl der Shell . Beachten Sie auch,xargs
dass die Eingabe in einem sehr speziellen Format erwartet wird (Leerzeichen, Zeilenumbrüche, Anführungszeichen und umgekehrte Schrägstriche haben eine besondere Bedeutung).cat
hier nicht machen viel Sinn , da es nur eine Datei zu verketten (gleich wie< file.txt xargs echo
Hinweis , dass Unix - kompatibel.echo
s tun Backslash Escape - Expansion von Standard und Ausgang-e
aufecho -e
.In bash sollte auch folgendes funktionieren:
Der Teil in Backticks wird durch die Ausgabe dieses Befehls ersetzt, dh in diesem Fall durch den Dateiinhalt.
quelle
$( . . . )
. Leute, die sie$()
normalerweise benutzen, bevorzugen sie, weil man sie nisten kann. Diese Frage ist alt, aber es ist viel befriedigender, Fragen zu beantworten, die noch nicht beantwortet wurden!my_file.txt
enthält*
, wird die Liste der Dateinamen im aktuellen Verzeichnis gedruckt.