Saya tahu dua jenis bagaimana perintah dapat dihubungkan satu sama lain:
- dengan menggunakan Pipe (menempatkan std-output ke std-input dari perintah selanjutnya).
- dengan menggunakan Tee (splice output menjadi banyak output).
Saya tidak tahu apakah itu yang mungkin dilakukan, jadi saya menggambar tipe koneksi hipotetis:
Bagaimana mungkin untuk mengimplementasikan aliran sirkuler data di antara perintah seperti misalnya dalam kode pseudo ini, di mana saya menggunakan variabel alih-alih perintah .:
pseudo-code:
a = 1 # start condition
repeat
{
b = tripple(a)
c = sin(b)
a = c + 1
}
sumber
Secara umum saya akan menggunakan Makefile (perintah make) dan mencoba memetakan diagram Anda untuk membuat aturan file.
Untuk memiliki perintah berulang / siklik, kita perlu mendefinisikan kebijakan iterasi. Dengan:
masing
make
- masing akan menghasilkan satu iterasi pada saat itu.sumber
make
, tetapi tidak perlu: Jika Anda menggunakan file perantara, mengapa tidak menggunakan loop untuk mengelolanya?make
ini tentang makro yang merupakan aplikasi yang sempurna di sini.Anda tahu, saya tidak yakin Anda tentu membutuhkan umpan balik berulang-ulang sebagai diagram Anda menggambarkan, begitu banyak seperti mungkin Anda bisa menggunakan persisten pipa antara coprocesses . Kemudian lagi, mungkin tidak ada terlalu banyak perbedaan - setelah Anda membuka garis pada suatu proses, Anda dapat menerapkan loop gaya khas hanya dengan menulis informasi dan membaca informasi darinya tanpa melakukan sesuatu yang sangat luar biasa.
Pertama-tama, akan terlihat bahwa itu
bc
adalah kandidat utama untuk proses-ulang untuk Anda. Dibc
Anda dapatdefine
fungsi yang dapat melakukan cukup banyak apa yang Anda minta di pseudocode Anda. Misalnya, beberapa fungsi yang sangat sederhana untuk melakukan ini dapat terlihat seperti:... yang akan mencetak ...
Tapi tentu saja, itu tidak bertahan lama . Segera setelah subkulit yang bertanggung jawab atas
printf
pipa berhenti (tepat setelahprintf
menulisa()\n
ke pipa) pipa tersebut dirobohkan danbc
input menutup dan juga berhenti. Itu hampir tidak berguna seperti yang seharusnya.@derobert telah menyebutkan FIFO s seperti yang bisa didapat dengan membuat file pipa bernama dengan
mkfifo
utilitas. Ini pada dasarnya hanya pipa juga, kecuali kernel sistem menautkan entri sistem file ke kedua ujungnya. Ini sangat berguna, tetapi akan lebih baik jika Anda hanya dapat memiliki pipa tanpa risiko mengintai di sistem file.Ketika itu terjadi, shell Anda sering melakukan ini. Jika Anda menggunakan shell yang menerapkan substitusi proses maka Anda memiliki cara yang sangat mudah untuk mendapatkan pipa yang tahan lama - dari jenis yang mungkin Anda tetapkan untuk proses latar belakang yang dengannya Anda dapat berkomunikasi.
Dalam
bash
, misalnya, Anda dapat melihat cara kerja proses substitusi:Anda lihat itu benar-benar substitusi . Shell mengganti nilai selama ekspansi yang sesuai dengan jalur ke tautan ke pipa . Anda dapat memanfaatkan itu - Anda tidak perlu dibatasi untuk menggunakan pipa itu hanya untuk berkomunikasi dengan proses apa pun yang berjalan di dalam
()
substitusi itu sendiri ...... yang mencetak ...
Sekarang saya tahu bahwa shell yang berbeda melakukan hal coprocess dengan cara yang berbeda - dan bahwa ada sintaks khusus
bash
untuk pengaturan satu (dan mungkin satu untukzsh
juga) - tetapi saya tidak tahu bagaimana hal-hal itu bekerja. Saya hanya tahu bahwa Anda dapat menggunakan sintaks di atas untuk melakukan hal yang hampir sama tanpa semua omong kosong di keduanyabash
danzsh
- dan Anda dapat melakukan hal yang sangat miripdash
danbusybox ash
untuk mencapai tujuan yang sama dengan dokumen-dokumen di sini (karenadash
danbusybox
lakukan di sini- dokumen dengan pipa daripada file temp seperti yang dilakukan dua lainnya) .Jadi, ketika diterapkan ke
bc
...... itu bagian yang sulit. Dan ini adalah bagian yang menyenangkan ...
... yang mencetak ...
... dan masih berjalan ...
... yang hanya membuat saya nilai terakhir untuk
bc
'sa
daripada memanggila()
fungsi untuk kenaikan itu dan cetakan ...Ini akan terus berjalan, pada kenyataannya, sampai saya membunuhnya dan menghancurkan pipa IPC-nya ...
sumber
eval "exec {BCOUT}<>"<(:) "{BCIN}<>"<(:)
Berfungsi juga