これらの2つのコマンドからの出力を結合することは可能ですか?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
どちらのコマンドも終了しないので、これを行う方法がわかりません。
これらの2つのコマンドからの出力を結合することは可能ですか?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
どちらのコマンドも終了しないので、これを行う方法がわかりません。
回答:
次のようにグループ化することにより、2つのコマンドを組み合わせることができます{ }
。
{ command1 & command2; }
これまでは、グループをファイルにリダイレクトできます(最後の;
前}
は必須です)。
{ command1 & command2; } > new_file
あなたは、分離したい場合STDOUT
やSTDERR
2つのファイルに:
{ command1 & command2; } > STDOUT_file 2> STDERR_file
;
前の最後を欠いているようだ}
、それは必須です!
{ yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'
行を分割しない場合、理想的には何も印刷しないこれを試すことができます。
&&
代わりに使用したいと思います&
! command1 & command2
-これはcommand1をバックグラウンドで実行し、command2をすぐに開始します。したがって、両方のコマンドを並行して実行し、出力を台無しにします。 command1 && command2
-これはcommand1(フォアグラウンドで)を実行し、command1が成功した場合、command2を実行します。
より一般的には、サブシェルまたはコマンドのグループ化を使用して、グループ全体の出力を一度にリダイレクトすることができます。
コード:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
2つの主な違いは、最初のプロセスが子プロセスを分割し、2番目のプロセスがメインシェルのコンテキストで動作することです。これは、パフォーマンスと同様に、変数および他の環境設定の設定と使用に関して結果をもたらす可能性があります。
コマンドのグループ化(および関数)の閉じ括弧は、セミコロンまたは改行のいずれかでコンテンツから分離する必要があることを忘れないでください。これは、"}"
実際にはそれ自体がコマンド(キーワード)であり、1つのように処理する必要があるためです。
( )
も正常に機能します。
}
コマンドではありません。予約語です。同じことが当てはまります{
。私は通常、そのようなリストを次のように書きます{ command1;command2;} > outfile.txt
。セミコロンの後にスペースを追加できますが、必須ではありません。ただし、その後のスペース{
が必要です。
( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
行を分割しない場合、理想的には何も印刷しないこれを試すことができます。(H / tから@antak)。
( command1 && command2 && command3 ) | cat
()
中括弧{}
と同様に、丸括弧を好むので、そこからの出力を処理する必要があります。猫にパイプする `| cat`は、よりよい代替次いで`>の/ dev / stdout`ある
2番目のコマンドは強制終了されるか、実行されなかったため、他の提案は機能しませんでした。
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
が、同じログファイルに書き込む2つの異なるプロセスの問題としてこれを見たことはありませんが。
yes {1..20}
command2 =で試してみて、理想的には行が壊れていない場合は何も印刷しないyes {1..20}
結合出力をパイプで送ることができ| grep -v '^1 2 3'
ます。(H / tから@antak)。
これを試して:
paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
これまでのほとんどの解決策は、部分的なラインの問題をうまく扱っていません。プログラムが次のとおりであると仮定します。
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
これらを並行して実行する場合、出力にa
sの全行とそれに続くsの全行が必要ですb
。何をではないしたいことはあるa
のとb
同じ行に混合秒(tr -s ab
繰り返し置き換えa
sが単一でa
、何が起こるか見てする方が簡単です):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
代わりにGNU Parallelを使用すると、a
sまたはb
s できれいな完全な行が得られますが、混在することはありません。
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
GNU Parallelの新しいバージョンでは、ディスクがいっぱいになることさえ回避できます。上記は永久に実行できます。
複数のBASHコマンド出力を1行に結合する特別な場合について、各コマンドを順番に実行し、出力間の改行を削除するレシピを次に示します。
(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef
実際の例として、以下のコードは2つの固定バイト文字列の間にASCIIメッセージを埋め込みます(この場合、印刷コマンドを形成します)
# 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
(注:このメソッドは、コマンドが終了する場合にのみ機能します。終了しないコマンドからstdoutを組み合わせるには、他の回答を参照してください。)