Apakah mungkin untuk menggabungkan output dari dua perintah ini?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Tidak ada perintah yang keluar jadi saya tidak yakin bagaimana melakukan ini.
Apakah mungkin untuk menggabungkan output dari dua perintah ini?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Tidak ada perintah yang keluar jadi saya tidak yakin bagaimana melakukan ini.
Jawaban:
Anda dapat menggabungkan dua perintah dengan mengelompokkannya dengan { }
:
{ command1 & command2; }
sejauh ini, Anda dapat mengalihkan grup ke file (terakhir ;
sebelum }
wajib):
{ command1 & command2; } > new_file
jika Anda ingin memisahkan STDOUT
dan STDERR
dalam dua file:
{ command1 & command2; } > STDOUT_file 2> STDERR_file
;
sebelumnya }
, itu wajib!
{ yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'
yang idealnya tidak akan mencetak apa pun jika garis tidak putus.
&&
daripada &
! command1 & command2
- ini menjalankan command1 di latar belakang dan memulai command2 segera, sehingga menjalankan kedua perintah secara paralel dan mengacaukan output. command1 && command2
- ini menjalankan command1 (di latar depan) dan kemudian, jika command1 berhasil, jalankan command2.
Secara umum, dimungkinkan untuk menggunakan subkulit atau pengelompokan perintah, dan mengarahkan output dari seluruh grup sekaligus.
Kode:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
Perbedaan utama antara keduanya adalah bahwa yang pertama membagi proses anak, sedangkan yang kedua beroperasi dalam konteks shell utama. Ini dapat memiliki konsekuensi mengenai pengaturan dan penggunaan variabel dan pengaturan lingkungan lainnya, serta kinerja.
Jangan lupa bahwa braket penutup dalam pengelompokan perintah (dan fungsi) harus dipisahkan dari konten dengan titik koma atau baris baru. Ini karena "}"
sebenarnya adalah perintah (kata kunci) sendiri, dan harus diperlakukan seperti itu.
( )
berfungsi dengan baik juga.
}
sama sekali bukan perintah. Itu kata yang dilindungi undang-undang. Sama berlaku untuk {
. Saya biasanya menulis daftar tersebut seperti: { command1;command2;} > outfile.txt
. Anda bisa menambahkan spasi setelah titik koma tetapi tidak perlu. Ruang setelah {
ini diperlukan, meskipun.
( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
yang idealnya tidak akan mencetak apa pun jika garis tidak putus. (T / ke @antak).
( command1 && command2 && command3 ) | cat
()
seperti kurung keriting {}
berjalan sebagai latar belakang dan kemudian Anda harus berurusan dengan output dari itu. Juga pipa ke kucing `| cat` adalah alternatif yang lebih baik daripada `> / dev / stdout`
Saya akhirnya melakukan ini, saran lain tidak berhasil, karena perintah ke-2 terbunuh atau tidak pernah dieksekusi.
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
walaupun saya belum pernah melihat ini sebagai masalah dengan 2 proses berbeda menulis ke file log yang sama.
yes {1..20}
command2 = yes {1..20}
dan menyalurkan output gabungan | grep -v '^1 2 3'
yang idealnya tidak akan mencetak apa pun jika garis tidak rusak. (T / ke @antak).
Coba ini:
paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
Sebagian besar solusi sejauh ini sangat buruk dengan masalah garis parsial. Asumsikan sebentar bahwa programnya adalah:
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
Saat menjalankannya secara paralel, Anda ingin output memiliki garis penuh a
s diikuti dengan garis penuh b
s. Apa yang tidak Anda inginkan adalah pencampuran s a
dan b
s pada baris yang sama ( tr -s ab
menggantikan pengulangan a
dengan satu a
, sehingga lebih mudah untuk melihat apa yang terjadi):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
Jika Anda menggunakan GNU Parallel, Anda mendapatkan baris penuh bersih yang bagus dengan a
s atau b
s tetapi tidak pernah dicampur:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
Versi GNU Paralel yang lebih baru bahkan menghindari mengisi disk Anda: Hal di atas dapat berjalan selamanya.
Karena Anda sudah menggunakan node
, Anda mungkin ingin mencoba secara bersamaan
Jalankan beberapa perintah secara bersamaan. Suka
npm run watch-js & npm run watch-less
tapi lebih baik.
Untuk kasus khusus menggabungkan beberapa output perintah BASH ke satu baris, berikut adalah resep untuk menjalankan setiap perintah secara bergantian, menghapus baris baru di antara output mereka.
(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef
Sebagai contoh dunia nyata, kode di bawah ini akan menyematkan pesan ASCII antara dua string byte tetap (membentuk perintah cetak, dalam hal ini)
# 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
(Catatan: metode ini hanya berfungsi jika perintah keluar. Untuk menggabungkan stdout dari perintah yang tidak keluar, lihat jawaban lain.)