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.
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.
Antworten:
Sie können zwei Befehle kombinieren, indem Sie sie gruppieren mit { }
:
{ command1 & command2; }
so weit, können Sie die Gruppe in eine Datei umleiten können (letzte ;
vor }
zwingend erforderlich):
{ command1 & command2; } > new_file
Wenn Sie STDOUT
und STDERR
in zwei Dateien trennen möchten :
{ command1 & command2; } > STDOUT_file 2> STDERR_file
;
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.
( )
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.
alias app () {
nohup python ~/projects/trunk/run.py run 1>/tmp/log 2>&1 &
echo $! > /tmp/api.pid
nohup node ~/projects/trunk/index.js 1>/tmp/log 2>&1 &
echo $! > /tmp/client.pid
tail -f /tmp/log
}
tail -f *.log
obwohl ich dies nie als Problem mit 2 verschiedenen Prozessen gesehen habe, die in dieselbe Protokolldatei schreiben.
yes {1..20}
command2 = versuchen yes {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:
paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
Die meisten der bisherigen Lösungen behandeln das Teilleitungsproblem schlecht. Nehmen Sie für eine Sekunde an, dass die Programme:
cmd1() {
perl -e 'while(1) { print "a"x3000_000,"\n"}'
}
export -f cmd1
cmd2() {
perl -e 'while(1) { print "b"x3000_000,"\n"}'
}
export -f cmd2
Wenn Sie diese parallel ausführen, möchten Sie, dass die Ausgabe vollständige Zeilen von a
s gefolgt von vollständigen Zeilen von b
s enthält. Was Sie nicht wollen, ist das Mischen von a
s und b
s in derselben Zeile ( tr -s ab
ersetzt das Wiederholen von a
s durch ein einzelnes a
, damit Sie leichter sehen können, was passiert):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
Wenn Sie stattdessen GNU Parallel verwenden, erhalten Sie nette, saubere, vollständige Linien mit a
s oder b
s, die jedoch niemals gemischt werden:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
Neuere Versionen von GNU Parallel vermeiden sogar das Auffüllen Ihrer Festplatte: Die oben genannten können für immer ausgeführt werden.
Da Sie bereits verwenden node
, möchten Sie es möglicherweise gleichzeitig versuchen
Führen Sie mehrere Befehle gleichzeitig aus. Mag
npm run watch-js & npm run watch-less
aber besser.
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.
(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef
Als reales Beispiel wird im folgenden Code eine ASCII-Nachricht zwischen zwei festen Bytefolgen eingebettet (in diesem Fall ein Druckbefehl).
# hex prefix encode a message as hex hex suffix | strip newline | hex to binary | (then, for example, send the binary over a TCP connection)
(echo '1b40' && echo "Test print #1" | xxd -p && echo '1d564103') | tr -d '\n' | xxd -r -p | nc -N 192.168.192.168 9100
(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.)