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?

 14
Author: Ringger81, 2018-01-13

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.

 24
Author: mvw,
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.

 21
Author: Nubarke,
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.

 7
Author: Gerard H. Pille,
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.

 2
Author: muclux,
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)

 2
Author: Xen2050,
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
 0
Author: FrDarryl,
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
 0
Author: Nasir Riley,
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