Kullanıcıdan hala komutları okuyabilmek için `less` stdin'den nasıl veri alır?


47

Çoğunuz birçok kez yaptığınız gibi, aşağıdakileri kullanarak uzun metinleri görüntülemek uygun olacaktır less:

some_command | less

Şimdi stdin bir boruya (FIFO) bağlandı. Yukarı / aşağı / çık gibi komutları nasıl okuyabilir?


15
lessstdin'den gösterilecek verileri okur ve tty'den gelen komutları okur. Onlar farklı şeyler.
William Pursell

2
@WilliamPursell Evet biliyorum. Ama sadece bir standart giriş akışı var, değil mi?
iBug

4
Evet, bir giriş akışı ve bir tane tty var. lessstdin'den veri okur ve tty'den komutlar
William Pursell

Yanıtlar:


52

Tarafından belirtildiği gibi , William Pursell , lessterminalden kullanıcının tuş vuruşlarını okur. Açıkça /dev/ttykontrol terminalini açar ; bu, kullanıcının etkileşimli girdisini okuyabileceği standart girdiden ayrı bir dosya tanıtıcısı verir. Gerekirse standart girişinden görüntülemek için verileri aynı anda okuyabilir. ( Gerekirse doğrudan terminale de yazabilir .)

Bunu çalıştırarak görebilirsiniz

some_command | strace -o less.trace -e open,read,write less

Girdi etrafında hareket edin, çıkın lessve içeriğine less.tracebakın: açık göreceksiniz /dev/ttyve her iki dosya tanımlayıcısından 0'ı ve hangisi açıldığında geri döndü /dev/tty(muhtemelen 3).

Bu, terminale okuma ve yazmayı sağlamak isteyen programlar için yaygın bir uygulamadır. Bir örnek SSH'dir, örneğin bir şifre veya şifre sorduğunda.

Şöyle açıklanabilir tarafından Schily , eğer /dev/ttyaçılamaz, lessstandart hata (dosya tanıtıcı 2) den okuyacaktır. lesskullanımı, /dev/tty2 Nisan 1991'de yayımlanan 177 sürümünde tanıtıldı.

Çalıştırmakta denerseniz cat /dev/tty | lessolarak, önerilen tarafından Hagen von Eitzen , lessaçılış başarılı olacaktır /dev/ttyama kadar ondan herhangi bir giriş almazsınız catkapanmadan o. Öyleyse ekranı boş göreceksiniz ve CtrlCöldürmek cat(veya başka bir şekilde öldürmek için) tuşuna basana kadar başka hiçbir şey görmeyeceksiniz ; sonra çalışırken lessyazdıklarınızı gösterecek catve kontrol etmenize izin verecektir.


4
@HagenvonEitzen Bilgisayarınız patlayacak! Kirk ve Spock'un Mudd'un androidlerinin çökmesine neden olduğu gibi.
Barmar

7
@HagenvonEitzen Vay. Bir çift- yararsız kedi kullanımı . Etkilendim.
Andrew Henle,

8
@grawity Andrew'ın amacının bunun cat blah |yerini alabileceğini < blahve hatta bu durumda da less blahişe yaramayacağına ( hatta) gereksiz olduğuna inanıyorum less -f /dev/tty. Ancak, okuması /dev/ttybiraz özel bir durumdur ve üç değişkenin de ( cat /dev/tty | less, less < /dev/ttyve less -f /dev/tty) her biri farklı sonuçlar verir.
Stephen Kitt

1
/ Dev / tty her zaman bir şekilde doğru yere işaret eder mi? Genellikle / dev / ptsX kullanmanız gerektiğini düşünürdüm?
StarWeaver

2
@ StarWeaver ve arasındaki farkla ilgili bu soruyu görün . /dev/tty/dev/pts/...
Stephen Kitt

26

UNIX, stdin yeniden yönlendirilirken kullanıcıların girişini okumak için iki yöntem sunar:

  • Orijinal yöntem stderr'den okumaktır . Stderr yazma ve okumaya açık ve POSIX'de yine de bahsedilmiştir.

  • Daha sonra UNIX sürümleri (yaklaşık 1979) /dev/ttybir sürecin kontrol şeklini açmaya izin veren bir sürücü arayüzü ekledi. Kontrol tty'siz süreçler /dev/ttyolduğundan , açma denemesinin başarısız olması mümkündür . Bu nedenle, dostça yazılmış yazılımın orijinal metoda dönüşü vardır ve daha sonra stderr'den okumaya çalışır.


11
Stderr'den okudun mu? Yeni bir şey öğrendim.
iBug

1
Birisinin eski yöntemleri hatırlamasına sevindim.
Joshua

3
Yönlendirmenin en az olası olması nedeniyle stderr'nin okuma için kullanılmasının nedeni bu mu? Onunla stdout arasında başka bir fark görmüyorum (ya da yeniden yönlendirmeden önce bu mater stdin için).
ctrl-alt-delor

4
Evet, çünkü bu, yönlendirilme şansı en az olan dosya tanımlayıcısıdır.
schily

@ ctrl-alt-delor: Hepsi dup()aynı dosya tanımının lisansı olan stdin, stdout ve stderr ile çalışan kabukların tümü tty'de açılmış / tipiktir. (Stderr gibi bir şeyle açılmaz, bir okuma / yazma FD olması) Anlaşılan POSIX hala gerektirir veya bu cevabı demiyor (önermek open("/dev/ttyS0", O_WRONLY)Okuma Stderr bu durumda başarısız oluyordu..)
Peter Cordes
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.