2016-03-05 25 views
12

Bash'de bu gibi doğrusal olmayan bir boru hattı oluşturmanın en temiz (en basit, en verimli, en kısa, en hızlı, en kolay, en zarif) yolu nedir? ircpingpong mksock, irclogin ve :Bash'te doğrusal olmayan bir boru hattı oluşturmanın en temiz yolu nedir?

Üç komutları var. Ben mksock içine boru ircpingpong Stdin, irclogin ve istiyor ve boru mksockstdout içine ve ircpingpong. Bu, mksock ve ircpingpong'un bir döngüde olduğu anlamına gelir. Bir diyagram çizdim. Diagram

irclogin sadece mksock içine ilk girişini bir kez çalıştırın ve sokulması gerekmektedir. Bundan sonra herhangi bir zamanda ircpingpong ve stdin kabul edilmelidir.

#!/bin/bash 

server=127.0.0.1 
port=6667 

infifo=/tmp/ircin 
outfifo=/tmp/ircout 
pongfifo=/tmp/ircpong 

rm $infifo 
rm $outfifo 
rm $pongfifo 
mkfifo $infifo 
mkfifo $outfifo 
touch $pongfifo 

(irclogin | cat - $infifo & tail -f $pongfifo;) | mksock $server $port | tee $outfifo | stdbuf -oL ircpingpong > $pongfifo & 
cat < $outfifo & 
cat > $infifo 
pkill tail 

Bu çalışır, ancak bunu yapmak için daha iyi bir yolu olup olmadığını bilmek istiyorum: Şu anda böyle boruları ve geçici bir dosya kullanıyorum. Kuyruk kullanarak ircpingpongmksock'a geri döngü için bir boru yerine bir dosya kullanıyorum beni rahatsız ediyor. Bir boru kullanmak işe yaramadı, çünkü benim anlayışıma göre, bir şey, okumaya başlamadan önce boruya bir şeyler yazıyor ve bu yüzden özlüyor. Ayrıca, komut dosyasının sonunda kuyruğu öldürmem gerektiğinden dolayı beni rahatsız ediyor, çünkü kendi başına durmuyor ve senaryo bittikten sonra bile sokete bağlı kalıyor.

+2

Bu, Coproceses için ne demektir. Korn kabuğunda farklı şekilde desteklenirler ve bash, bash coprocesses bash 4.0'da tanıtıldı. Http://wiki.bash-hackers.org/syntax/keywords/coproc sayfasına bakın. – cdarke

cevap

2

ben ve iki fifo-ler ile, geçici dosyalar olmadan bir sürümünü önerebilirsiniz:

fikri ayrı ayrı tüm programları çalıştırmak ve sadece düzgün yönlendirildi göre her programın bu giriş ve çıkış sağlamaktır
fifo1=/tmp/fifo1 
fifo2=/tmp/fifo2 
rm $fifo1 
rm $fifo2 
mkfifo $fifo1 
mkfifo $fifo2 

ircpingpong < $fifo1 > $fifo2 & 
(mksock <$fifo2|tee $fifo1)& 
irclogin >$fifo2 & 
cat >$fifo2 

Bu şemaya:

tabii

pipe-flow

, ircpingpongstdin okuyup stdout yazmam gereken, ircloginyazmam gerekenve mksock, stdin'dan okuyup stdout'a yazmalıdır.