Saya memiliki program P
yang mengharapkan untuk menerima "Halo" dan menampilkan "Mengapa?" sebelum menyediakan fitur. Fitur ini digunakan oleh program lain yang tidak menyadari bahwa adalah hal yang umum untuk memulai percakapan dengan "Halo". Jadi saya ingin menulis pembungkus untuk P
yang berfungsi seperti ini (sintaks zsh):
coproc P
print -p Hello # Send Hello to P
read -pr line # Read what P has to say
[[ "$line" = "Why?" ]] && Replace current process with the coprocess.
echo Could not get P's attention.
Menggunakan cat
atau dd
di Replace...
bagian (sesuatu seperti cat <&p &; exec cat >&p
) menghasilkan buffering yang tidak perlu. Apa saja pilihan saya?
zsh
solusi atau apakahbash
solusi itu dapat diterima?bash
solusi yang tidak berlaku dizsh
, tetapi pasti akan menerimanya ☺ssh
dan pilihannyaProxyCommand
.cat
umumnya tidak buffer. Jika berhasil di sistem Anda, cobacat -u
.Jawaban:
Masalah yang Anda nyatakan bukan tentang mengganti proses , tetapi mengganti aliran proses yang ada . Tujuannya adalah untuk berinteraksi sedikit dengan proses kemudian menyerahkan input / output ke sepasang aliran yang terhubung.
Tidak ada cara untuk melakukan ini secara langsung (setidaknya, di shell; di dalam proses,
dup2
panggilan mungkin bisa berfungsi). Anda perlu menyambungkan stream. Yaitu:Menggunakan
coproc
seperti pada contoh Anda juga OK. Perhatikan bahwa perintah menyimpan deskriptor file ke array, dan nanti Anda dapat menggunakannya untuk pengalihan.Ini seharusnya tidak menyebabkan buffering tambahan (setidaknya dengan GNU cat), kecuali P memeriksa aliran input / output yang terhubung dan membuat keputusan untuk buffer berdasarkan itu. Misalnya, pustaka standar C akan mengaktifkan buffering pada
stdout
/stderr
jika mereka terhubung ke file, tetapi hanya melakukan buffering baris jika mereka terhubung ke terminal.sumber
Mampu menguji dengan kode di bawah ini menggunakan perl untuk menghindari buffering, coba jika ini cocok untuk Anda
sumber
dd ibs=1
, misalnya. Saya tidak setuju dengan ini. Di satu sisi, coproc memiliki buffering sendiri, dan inilah yang ingin saya gunakan.