Pipa pertama ini berfungsi dengan baik (mencetak "c"):
echo "a" | sed 's/a/b/' | sed 's/b/c/'
Yang ini tidak melakukan apa yang saya harapkan (tidak ada yang dicetak ketika saya memberi "a" ke fifo saya):
mkfifo fifo;
cat fifo | sed 's/a/b/' | sed 's/b/c/'
Namun, jika saya menghapus perintah "sed" kedua dari pipa yang terakhir, saya mendapatkan cetakan "b". Saya pikir pemahaman saya tentang pipa dan pengalihan harus terlalu sederhana. Dapatkah seseorang menjelaskan kepada saya cara memperbaiki kasus ke-2 sehingga saya dapat menjalankan dua perintah berturut-turut pada isi fifo?
(perhatikan ini bukan masalah khusus untuk fifo, perilaku yang sama terjadi dengan netcat juga. Saya memposting pertanyaan serupa tentang netcat tetapi tidak mendapat jawaban)
echo "a" >fifo
GNU sed version 4.2.1
Jawaban:
Gunakan opsi
-u
(--unbuffered
) dari sed, jadi ia menulis outputnya, alih-alih mengumpulkannya terlebih dahulu untuk menulis cepat dan besar nanti.cat fifo | sed -u 's/a/b/' | sed -u 's/b/c/'
cat
selalu tanpa gangguan.Jika ini bukan tentang
sed
, tetapi beberapa program dengan buffering output, tetapi tanpa opsi untuk menonaktifkannya, ada alat yang dapat membantu untuk memaksa buffering off - lihatman unbuffer
danman stdbuf
.Jika itu adalah skrip shell, itu harus di-unbuffered secara default: ketika sebuah perintah membuat output di skrip, dan keluar, outputnya memerah. Jika tidak, Anda menggunakan unbuffer di dalam skrip shell.
Untuk latar belakang, lihat ikhtisar tentang penyangga stdio ini .
sumber
nc -k -l 4458 | perl -ne 's{HTTP}{FTP}g; $|++;print $_' | perl -ne 's{FTP}{RTSP}g; $|++;print $_'
ssed -R
jika Anda sukased
dengan ekspresi reguler perl.