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.
bash
io-redirection
kenyal
sumber
sumber
Jawaban:
Anda dapat menggabungkan dua perintah dengan mengelompokkannya dengan
{ }
:sejauh ini, Anda dapat mengalihkan grup ke file (terakhir
;
sebelum}
wajib):jika Anda ingin memisahkan
STDOUT
danSTDERR
dalam dua file:sumber
;
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.sumber
( )
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.
sumber
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:
sumber
Sebagian besar solusi sejauh ini sangat buruk dengan masalah garis parsial. Asumsikan sebentar bahwa programnya adalah:
Saat menjalankannya secara paralel, Anda ingin output memiliki garis penuh
a
s diikuti dengan garis penuhb
s. Apa yang tidak Anda inginkan adalah pencampuran sa
danb
s pada baris yang sama (tr -s ab
menggantikan pengulangana
dengan satua
, sehingga lebih mudah untuk melihat apa yang terjadi):Jika Anda menggunakan GNU Parallel, Anda mendapatkan baris penuh bersih yang bagus dengan
a
s ataub
s tetapi tidak pernah dicampur:Versi GNU Paralel yang lebih baru bahkan menghindari mengisi disk Anda: Hal di atas dapat berjalan selamanya.
sumber
Karena Anda sudah menggunakan
node
, Anda mungkin ingin mencoba secara bersamaansumber
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.
Sebagai contoh dunia nyata, kode di bawah ini akan menyematkan pesan ASCII antara dua string byte tetap (membentuk perintah cetak, dalam hal ini)
(Catatan: metode ini hanya berfungsi jika perintah keluar. Untuk menggabungkan stdout dari perintah yang tidak keluar, lihat jawaban lain.)
sumber