Cat-Befehl und echo
Ich möchte die Ausgabe von echo mit dem Inhalt einer Datei verketten. Ich habe den folgenden Comand ausprobiert:
echo "abc" | cat 1.txt > 2.txt
Die Datei 2.txt
enthält jedoch nur den Inhalt von 1.txt
. Warum funktioniert es nicht?
7 answers
Es funktioniert nicht, weil das Programm cat
in Ihrer Pipe-Sequenz nicht angewiesen wurde, die Ausgabe des Programms echo
von der Standardeingabe zu lesen.
Sie können -
als Pseudodateinamen verwenden, um die Standardeingabe für cat
anzugeben.
Von man cat
auf einer msys2-Installation:
EXAMPLES
cat f - g
Output f's contents, then standard input, then g's contents.
Also versuche
echo "abc" | cat - 1.txt > 2.txt
Statt.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-01-13 12:05:53
Wie von anderen erwähnt, schlägt Ihr ursprünglicher Befehl fehl, weil cat 1.txt
seine Standardeingabe ignoriert. Geben Sie entweder an, dass es das erste Argument sein sollte (cat - 1.txt
), oder verwenden Sie Blockumleitung, um umzuleiten echo abc
und cat 1.txt
zusammen. Zu wit:
{ echo abc; cat 1.txt; } > 2.txt
Relevanter Auszug aus dem Handbuch (man bash
):
Zusammengesetzte Befehle
Ein zusammengesetzter Befehl ist einer der folgenden. In den meisten Fällen eine Liste in einem Befehl Beschreibung kann durch eine oder mehrere Zeilenumbrüche vom Rest des Befehls getrennt werden, und kann durch eine neue Zeile anstelle eines Semikolons gefolgt werden.
(
liste)
list wird in einer Subshell-Umgebung ausgeführt (siehe BEFEHLSAUSFÜHRUNGSUMGEBUNG unten). Variablenzuweisungen und eingebaute Befehle das beeinflusst die Umgebung der Shell nicht bleiben Sie in Kraft, nachdem der Befehl abgeschlossen ist. Der Rückgabestatus ist der exit-status Liste.
{
liste;
}
list wird einfach in der aktuellen Shell-Umgebung ausgeführt. list muss mit einer neuen Zeile oder einem Semikolon beendet werden. Dies wird als Gruppenbefehl bezeichnet. Der Rückgabestatus ist der Exit-Status von list. Beachten Sie, dass im Gegensatz zu den Metazeichen
(
und)
,{
und}
sind reserviert wörter und muss auftreten, wo a reserviertes Wort darf erkannt werden. Da sie keinen Wortbruch verursachen, sie müssen getrennt werden von list durch Leerzeichen oder ein anderes Shell-Metacharacter.
Die erste Option (Subshell-Umgebung) hat eine Reihe von Nebenwirkungen, von denen die meisten, wenn nicht alle für Ihr Szenario irrelevant sind; Wenn jedoch die Ausgabe einer Reihe von Befehlen umgeleitet wird, ist Option #2 hier (Gruppenbefehl) bevorzugt.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-01-13 18:34:23
( echo "abc"; cat 1.txt ) > 2.txt
Sie haben die Echoausgabe an cat geleitet, aber cat hatte keine Verwendung für die Eingabe und ignorierte sie. Jetzt werden die Befehle nacheinander ausgeführt, und ihre Ausgabe wird gruppiert (die Klammern) und in 2 geleitet.txt.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-01-13 13:05:55
Ihr Befehl cat 1.txt
macht nichts mit der Ausgabe von echo "abc"
.
Stattdessen:
(echo "abc"; cat 1.txt) > 2.txt
wird die Ausgabe beider Befehle in 2 schreiben.txt.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-01-13 10:44:54
In jeder POSIX-Shell können Sie die Befehlsersetzung verwenden, um cat file
als Eingabe für echo
zu verwenden:
echo $(cat file1.txt) "This Too"
In Bash können Sie process substitution verwenden und echo als eine andere "Datei" für cat
verwenden, wie in:
cat file1.txt <(echo This Too)
Und dann die Ausgabe nach Belieben weiterleiten oder umleiten.
Wie jede andere Antwort sagt, ignoriert cat stdin, wenn es eine Datei zum Ansehen hat. (Ich mag auch die Antworten von Daniel & mvw, +1 für sie)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-01-17 13:36:04
Nur eine Vermutung, aber es sieht so aus, als hätten Sie einen wiederholbaren Prozess, der ein guter Kandidat für einen Alias oder eine Funktion ist. Aliase sind normalerweise Abkürzungen zum Aufrufen von Bash-Befehlen, z. B. Abkürzung, für einen einzelnen Eingabestream als Argument/s.
alias hg="history | grep"
In diesem Fall wäre eine Funktion jedoch besser lesbar, da Sie mehrere diskrete (2) Eingabeströme sowie mehrere Bash-Befehle kombinieren. Sie haben zwei Argumente, das erste ist eine Zeichenfolge und das andere ein Dateipfad. In am Ende soll das Ergebnis in den stdout-Ausgabestream geschrieben werden.
Geben Sie in einer CLI-Eingabeaufforderung Folgendes ein:
# ecat()
{
echo ${1}
cat ${2}
}
Ihre Funktion heißt ecat, was unvergesslich ist.
Jetzt können Sie als
ecat "abc" 1.txt
Um anzuhängen, geben Sie einfach ein anderes Ausgabeziel an stdout:
ecat "abc" 1.txt >> 2.txt
Der Append-Umleitungsoperator '> > ' fügt die Ausgabe am Ende der angegebenen Datei hinzu.
Wenn es dir gefällt, dann hänge es an dein ~/an.bashrc-Datei für Wiederverwendung.
declare -f ecat >> ~/.bashrc
Das bedeutet auch, dass Sie dekorieren können usw., innerhalb Ihrer Funktionsdefinition.
Auch eine gute Idee, um Dateien vor dem Überschreiben zu schützen, indem Sie dies zu Ihrem ~ / hinzufügen.bashrc -
set noclobber
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-01-13 15:59:27
Der folgende code funktioniert auch:
echo abc >> 1.txt && cat 1.txt > 2.txt
Die Ausgabe von echo abc wird an 1 angehängt.txt mit >> Danach die && wird es anweisen,den nächsten Befehlssatz auszuführen, der cat 1.txt und gibt es dann in 2 aus.txt. Grundsätzlich hängt es die Ausgabe des ersten Befehls an 1 an.txt und sendet dann die Ausgabe von 1.txt in 2.txt.
Wenn das abc zuerst angezeigt werden soll, können Sie den folgenden Code verwenden:
echo abc >> 2.txt && cat 1.txt >> 2.txt
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-01-13 18:55:49