Bir programın çıktısını diğer iki programa aktarmanın bir yolu var mı?


28

Bu aptalca bir soru ise üzgünüm ama böyle bir şeyi bir satırda başarmaya çalışıyorum:

$ prog1 | prog2
$ prog1 | prog3

Bu yüzden temelde prog1'i yürütmek ve çıktısını prog2 ve prog3'e ayrı ayrı (zincirleme bir boruya değil) yönlendirmek istiyorum. İlk başta, tee kullanmaya çalışıyordum ama bu doğru görünmüyordu çünkü bir dosyaya çıktı atıyordu (ki istediğim bu değildi).

$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"

Bir noktada, muhtemelen bunu ikiden fazla programa yönlendirmek için genişletmek isterdim ama şimdilik sadece basit başlıyorum.

$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...

Bence zsh bunu yapabilir.
Keith

Yanıtlar:



16

Ignacio'nin cevabına benzer şekilde kullanarak geçici bir adlandırılmış yöneltme kullanabilirsiniz mkfifo(1).

mkfifo /tmp/teedoff.$$; cmd | tee /tmp/teedoff.$$ | prog2 & sleep 1; prog3 < /tmp/teedoff.$$; rm /tmp/teedoff.$$

Bu biraz daha ayrıntılı, ancak süreç değiştirme gibi sistemler üzerinde çalışacaktı dash. sleep 1Herhangi yarış koşulları ele almaktır.


6

İşi yapan küçük bir yardımcı program var:

prog1 | ptee 2 3 4 2> >(prog2) 3> >(prog3) 4> >(prog4)

Dosyalara yazmak yerine, ptee komut satırında verilen tüm fds dosyalarına yazar.

ptee parçasıdır pipexec .


4

Herhangi bir temel dosyaya veya özel dosyaya veya bunlardan birine ihtiyacınız yok - Linux'ta değil.

% { prog1 | tee /dev/fd/3 | prog2 >&2 ; } 3>&1 | prog3 

{ { printf %s\\t%s\\t%s\\n \
    "this uneven argument list" \
    "will wrap around" to \
    "different combinations" \
    "for each line." "Ill pick out" \
    "a few words" "and grep for them from" \
    "the same stream." | 
 tee /dev/fd/3 /dev/fd/4 | 
 grep combination >&2 ; } 3>&1 |
 grep pick >&2 ; } 4>&1 | 
 grep line

different combinations  for each *line.*  Ill pick out
different combinations  for each line.  Ill *pick* out
different *combinations*  for each line.  Ill pick out

grepAynı akıştan yalnızca üç sonuç değil, aynı zamanda ayrı grepişlem eşleşmelerinin sonucu olduğunu göstermem için vurgulanan sonuçları yıldızla işaretledim .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.