Apakah ada cara untuk hanya menjalankan perintah setelah yang lain dilakukan tanpa file temp? Saya punya satu perintah lagi yang berjalan dan perintah lain yang memformat output dan mengirimkannya ke server HTTP menggunakan curl. Jika saya hanya menjalankan commandA | commandB
, commandB
akan mulai curl
, terhubung ke server dan mulai mengirim data. Karena commandA
butuh waktu lama, server HTTP akan habis. Saya dapat melakukan apa yang saya inginkancommandA > /tmp/file && commandB </tmp/file && rm -f /tmp/file
Karena penasaran, saya ingin tahu apakah ada cara untuk melakukannya tanpa file temp. Saya mencoba mbuffer -m 20M -q -P 100
tetapi proses keriting masih dimulai tepat di awal. Mbuffer menunggu sampai commandA
selesai dengan benar-benar mengirim data. (Data itu sendiri hanya beberapa ratus kb maksimal)
commandA && commandB
?commandA
kecommandB
, bukan?Jawaban:
Ini mirip dengan beberapa jawaban lainnya. Jika Anda memiliki paket "moreutils", Anda harus memiliki
sponge
perintah. MencobaThe
sponge
perintah pada dasarnya adalah pass-melalui filter (seperticat
) kecuali bahwa ia tidak mulai menulis output sampai memiliki membaca seluruh masukan. Yaitu, itu "menyerap" data, dan kemudian melepaskannya ketika Anda memerasnya (seperti spons). Jadi, sampai batas tertentu, ini "curang" - jika ada jumlah data yang tidak sepele,sponge
hampir pasti menggunakan file sementara. Tapi itu tidak terlihat oleh Anda; Anda tidak perlu khawatir tentang hal-hal rumah tangga seperti memilih nama file yang unik dan membersihkannya setelah itu.The
{ IFS= read -r x; { printf "%s\n" "$x"; cat; } | commandB; }
membaca baris pertama dari keluaran darisponge
. Ingat, ini tidak muncul sampaicommandA
selesai. Kemudian menyalacommandB
, menulis baris pertama ke pipa, dan memanggilcat
untuk membaca sisa output dan menulisnya ke pipa.sumber
sponge
juga hal yang saya gunakanmbuffer
, tetapi tampaknya lebih cocok di sini. menggunakan baca itu pintar di sini. Pasti akan mengingat ini untuk masa depan.mbuffer
sebelumnya; mungkin sebenarnya sama baiknya dengansponge
. Saya setuju bahwa menggunakanread
adalah trik yang cerdas. Saya tidak bisa mengambil kredit penuh untuk itu; itu muncul dalam jawaban di seluruh Stack Exchange (U&L, Pengguna Super, Tanya Ubuntu, dll.) dari waktu ke waktu. Sebenarnya, jawaban roaima untuk pertanyaan ini sangat mirip dengan pertanyaan saya kecuali itu tidak menggunakansponge
(atau sesuatu yang setara), jadi, seperti yang saya sebutkan dalam komentar, itu tidak menunda memulaicommandB
sebanyak yang Anda butuhkan (dalam pemahaman saya tentang masalahmu).Perintah dalam saluran pipa dimulai secara bersamaan, Anda perlu menyimpan
commandA
output di suatu tempat untuk digunakan nanti. Anda dapat menghindari file temp dengan menggunakan variabel:sumber
echo A
proses substitusi?Saya tidak tahu adanya utilitas UNIX standar yang dapat mengatasi masalah ini. Satu opsi akan digunakan
awk
untuk mengakumulasicommandA
output dan menyiramnyacommandB
pada satu kesempatan, seperti ituBerhati-hatilah karena ini bisa menjadi memori intensif karena
awk
membangun string dari inputnya.sumber
\n
lainORS
di bagian akhir.Anda dapat menyelesaikan persyaratan dengan skrip kecil. Varian khusus ini menghindari file sementara dan potensi memori dengan mengorbankan proses tambahan.
Jika Anda memanggil skrip
waituntil
(dan membuatnya dapat dieksekusi, letakkan diPATH
, dll), Anda akan menggunakannya seperti iniContoh
sumber
commandB
sampaicommandA
telah menulis baris pertama output . Itu mungkin tidak cukup baik.sponge
. Tidak aktif untuk membaca yang itu sekarang.