Stdout'u ekranda tutarken nasıl borulanır? (çıktı dosyasına değil)


234

Ekranda tutarken bir programın standart çıktısını iletmek istiyorum.

Basit bir örnekle ( echoburada kullanım sadece örnekleme amaçlıdır):

$ echo 'ee' | foo
ee <- görmek istediğim çıktı

Tee stdout dosyaya kopyalamak biliyorum ama istediğim bu değil.
$ echo 'ee' | tee output.txt | foo

Denedim
$ echo 'ee' | tee /dev/stdout | fooama tee çıkışı için /dev/stdoutboru olduğu için çalışmıyorfoo


6
echo 'ee' | tee /dev/stderrYine de çalışır, bu nedenle "ekran" gereksiniminiz stderr tarafından da tatmin edilirse , bunu yapacağız.
nh2

Yanıtlar:


344

İşte herhangi bir Unix / Linux uygulamasında, POSIXstandardı takip etmeyi önemsediği varsayılarak çalışan bir çözüm . Bazı Unix olmayan ortamlarda cygwinda çalışır.

echo 'ee' | tee /dev/tty | foo

Referans: Açık Grup Temel Spesifikasyonları Sayı 7 IEEE Std 1003.1, 2013 Sürümü, §10.1 :

/ Dev / TTY

Varsa, bu sürecin süreç grubuyla ilişkilendirilir. Çıktının nasıl yeniden yönlendirildiğine bakılmaksızın terminale mesaj yazdığınızdan veya terminalden veri okuduğunuzdan emin olmak isteyen programlar veya kabuk prosedürleri için kullanışlıdır . Yazılı çıktı istendiğinde çıktı için bir dosya adı isteyen uygulamalar için de kullanılabilir ve şu anda hangi terminalin kullanımda olduğunu bulmak yorucu bir iştir. Her işlemde, kontrol terminalinin eşanlamlısı

Google Colab gibi bazı ortamların komutlarının kullanılabilir bir cihaz döndürmesine /dev/ttyrağmen uygulanmadığı bildirildi tty. İşte bir geçici çözüm:

tty=$(tty)
echo 'ee' | tee $tty | foo

veya eski bir Bourne kabuğuyla:

tty=`tty`
echo 'ee' | tee $tty | foo

5
@static_rtti Yorumunuza verdiğim yanıtları yıldan yıla neden görmezden geliyorsunuz?
jlliagre

1
@PaulBissex /dev/ttyzorunlu bir Unix cihazıdır. BSD hapishanesinde mi çalışıyorsunuz?
16:16

1
@PaulBissex Bu bir uygulama veya yapılandırma hatası. / Dev monte edildi mi? "Ls -l / dev / tty / dev / tty * / dev" nedir? Listelere bakın. Freebsd.org/pipermail/freebsd-bugs/2012-Kasım/… forumlar.freebsd.org/threads/…
jlliagre

1
Ve şöyle kademelendirebilirsiniz tee: cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.log1) hepsini konsola alın, 2) hepsini başka bir dosyaya ekleyin, 3) foosatırları farklı bir dosyaya alın.
Jesse Chisholm

1
Google Colab'da yok /dev/tty, ancak çıktısı ttykullanılabilir.
Tom Hale

69

Denenecek başka bir şey:

echo 'ee' | tee >(foo)

Bu >(foo)bir süreç ikamesidir .


1
foo çıkışını başka bir bara borulamak istersem ne olur?
Jack Tang

3
@JackTang - Bence çıkışındaki herhangi bir boru tesisatı fooişleminin bir parçası olmak zorunda. İşte bir örnek:echo 'ee' | tee file.txt >(wc -c | tr -d ' ')
Nick Chammas

1
Bu FreeBSD'de benim için çözümdü (no / dev / tty)
Paul Bissex

9
@Nick Chammas, Normal bir boru hattını korumak için tee: çıkışlarını değiştirebilirsiniz echo 'ee' | tee >(cat) | foo | bar.
Vaelus

18

"/ Dev / stdout" a erişim bazı sistemlerde reddedilir, ancak kullanıcı terminaline erişim "/ dev / tty" tarafından verilir. "Foo" için "wc" kullanarak, yukarıdaki örnekler aşağıdaki gibi çalışır (linux, OSX, vb.):

% echo 'Hi' | tee /dev/tty | wc Hi 1 1 3

Eşleşen dosyalar listesinin altına bir sayı eklemek için aşağıdakine benzer bir şey kullanırım:
% ls [A-J]* | tee /dev/tty | wc -l

Tüm bunları hatırlamak zorunda kalmamak için takma adlar tanımlarım:
% alias t tee /dev/tty
% alias wcl wc -l

böylece basitçe söyleyebilirim:
% ls [A-J]* | t | wcl


POSTSCRIPT: Telaffuzunda "titty" olarak dalga geçebilen genç set için, "tty" nin bir zamanlar sarı kağıt rulosu kullanan ve sık sık yuvarlak tuşlara sahip olan "teletype" terminalinin ortak kısaltması olduğunu ekleyebilirim. sıkıştı.


17

Deneyin:

$ echo 'ee' | tee /dev/stderr | foo

Stderr kullanmak elbette bir seçenektir.


8

önce ekranınızla ilişkili terminali (veya çıktının hangi ekranda görüntülenmesini istediğinizi) bulmanız gerekir:

tty

daha sonra çıktıyı bu terminale yönlendirebilir ve diğer kopyayı foo programınız üzerinden borulayabilirsiniz:

echo ee | tee /dev/pty/2 | foo

1
oneliner: t = $ (tty) yankı ee | tee $ t | foo | bar
Jack Tang

5
@JackTang Bu gerçekten daha iyi ama tişe yaramaz. Kullanabilirsiniz echo ee | tee $(tty) | fooama sadece işe yarıyorsa hala işe yaramaz bir komutu ( tty) var /dev/tty.
jlliagre
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.