Ist es möglich, die Ausgabe dieser beiden Befehle zu kombinieren?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Keiner der Befehle wird beendet, daher bin ich mir nicht sicher, wie ich das machen soll.
bash
io-redirection
chovy
quelle
quelle
Antworten:
Sie können zwei Befehle kombinieren, indem Sie sie gruppieren mit
{ }
:so weit, können Sie die Gruppe in eine Datei umleiten können (letzte
;
vor}
zwingend erforderlich):Wenn Sie
STDOUT
undSTDERR
in zwei Dateien trennen möchten :quelle
;
vor}
, es ist zwingend erforderlich!{ yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'
dem im Idealfall nichts gedruckt wird, wenn die Zeilen nicht unterbrochen sind.&&
anstatt&
!command1 & command2
- Dadurch wird command1 im Hintergrund ausgeführt und command2 sofort gestartet, wodurch beide Befehle parallel ausgeführt werden und die Ausgabe durcheinander gebracht wird.command1 && command2
- Dadurch wird Befehl1 (im Vordergrund) ausgeführt. Wenn Befehl1 erfolgreich war, wird Befehl2 ausgeführt.Allgemeiner ist es möglich, entweder eine Subshell oder eine Befehlsgruppierung zu verwenden und die Ausgabe der gesamten Gruppe auf einmal umzuleiten.
Code:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
Der Hauptunterschied zwischen den beiden besteht darin, dass der erste Teil eines untergeordneten Prozesses ausgeführt wird, während der zweite Teil im Kontext der Haupt-Shell ausgeführt wird. Dies kann Konsequenzen für die Einstellung und Verwendung von Variablen und anderen Umgebungseinstellungen sowie für die Leistung haben.
Vergessen Sie nicht, dass die schließende Klammer in der Befehlsgruppierung (und den Funktionen) durch ein Semikolon oder eine neue Zeile vom Inhalt getrennt sein muss. Dies liegt daran, dass
"}"
es sich tatsächlich um einen eigenen Befehl (ein eigenes Schlüsselwort) handelt, der wie ein solcher behandelt werden muss.quelle
( )
funktioniert auch.}
ist überhaupt kein Befehl. Es ist ein reserviertes Wort. Gleiches gilt für{
. Ich schreibe in der Regel solche Listen wie folgt:{ command1;command2;} > outfile.txt
. Sie können nach den Semikolons Leerzeichen einfügen, dies ist jedoch nicht erforderlich. Der Raum danach{
ist jedoch notwendig.( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
dem im Idealfall nichts gedruckt wird, wenn die Zeilen nicht unterbrochen sind. (H / t zu @antak).( command1 && command2 && command3 ) | cat
()
als die geschweiften Klammern{}
, die als Hintergrundfortschritt ausgeführt werden, und dann muss man sich mit der Ausgabe davon befassen. Pfeife auch zu Katze `| cat` ist eine schönere Alternative als `> / dev / stdout`Am Ende tat ich dies, die anderen Vorschläge funktionierten nicht, da der 2. Befehl entweder getötet oder nie ausgeführt wurde.
quelle
tail -f *.log
obwohl ich dies nie als Problem mit 2 verschiedenen Prozessen gesehen habe, die in dieselbe Protokolldatei schreiben.yes {1..20}
command2 = versuchenyes {1..20}
und die kombinierte Ausgabe leiten, durch| grep -v '^1 2 3'
die im Idealfall nichts gedruckt wird, wenn die Zeilen nicht unterbrochen sind. (H / t zu @antak).Versuche dies:
quelle
Die meisten der bisherigen Lösungen behandeln das Teilleitungsproblem schlecht. Nehmen Sie für eine Sekunde an, dass die Programme:
Wenn Sie diese parallel ausführen, möchten Sie, dass die Ausgabe vollständige Zeilen von
a
s gefolgt von vollständigen Zeilen vonb
s enthält. Was Sie nicht wollen, ist das Mischen vona
s undb
s in derselben Zeile (tr -s ab
ersetzt das Wiederholen vona
s durch ein einzelnesa
, damit Sie leichter sehen können, was passiert):Wenn Sie stattdessen GNU Parallel verwenden, erhalten Sie nette, saubere, vollständige Linien mit
a
s oderb
s, die jedoch niemals gemischt werden:Neuere Versionen von GNU Parallel vermeiden sogar das Auffüllen Ihrer Festplatte: Die oben genannten können für immer ausgeführt werden.
quelle
Da Sie bereits verwenden
node
, möchten Sie es möglicherweise gleichzeitig versuchenquelle
Für den speziellen Fall, dass mehrere BASH-Befehlsausgaben in einer Zeile kombiniert werden, finden Sie hier ein Rezept, mit dem jeder Befehl nacheinander ausgeführt wird, wobei alle Zeilenumbrüche zwischen den Ausgaben entfernt werden.
Als reales Beispiel wird im folgenden Code eine ASCII-Nachricht zwischen zwei festen Bytefolgen eingebettet (in diesem Fall ein Druckbefehl).
(Hinweis: Diese Methode funktioniert nur, wenn die Befehle beendet werden. Informationen zum Kombinieren von stdout von Befehlen, die nicht beendet werden, finden Sie in den anderen Antworten.)
quelle