Stderr'i hem okuma hem de yazma için nasıl (ve neden) kullanırsınız?


12

Göre Schily tarafından bu cevap , lesso açmak mümkün değilse stderr'e gelen navigasyon komutları okur /dev/tty.

Başka bir programın stderr akışına hiç bir şey yazdığımı görmediğim için bu şaşırtıcı görünüyor ve bunu nasıl başaracağımı bile bilmiyorum.

Stderr'in hem okuma hem de yazmaya açık olmasının amacı nedir? Ve eğer bu işe yararsa, modern sistemlerde nasıl kullanabilirim? (Örneğin, bir şeyi stdin yerine stderr'a bağlamak için bazı gizli sözdizimi var mı?)

Yanıtlar:


7

İlk başta şaşırdım. Ancak cevapları okuduktan ve biraz araştırma yaptıktan sonra basit görünüyor. İşte bulduğum şey. (sonunda sürpriz olmadı.)

Yeniden yönlendirmeden önce stdin, stdout ve stderr beklendiği gibi aynı cihaza bağlanır.

#ctrl-alt-delor:~$
#↳ ll /dev/std*
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stdout -> /proc/self/fd/1

#ctrl-alt-delor:~$
#↳ ll /proc/self/fd/*
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/0 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/1 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/2 -> /dev/pts/12

Bu nedenle, çoğu yeniden yönlendirmeden sonra (yani stderr) yeniden yönlendirilmez. stderr hala terminale bağlı. Bu nedenle klavye girişi almak okunabilir.

Beklenmedik yönde kullanılan dosyaları durduran tek şey kongre ve borular tek yönlüdür.

Başka bir örnek deneyin:

cat | less

Bir sayfadan sonra less, terminali okumaya çalışıldığında bu yanlış gidiyor (terminali catde okurken bu sürpriz değil ).

/dev/ttydaha gizemli, içine bir bağlantı değil /proc/self.

#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty

Bkz benim şimdiki kontrol terminali ve `/ dev / tty` arasında ne ilişki? bir açıklama için. Bağlantı için @StephenKitt'e teşekkürler.


İle ilgili olarak /dev/tty, bkz bu soruyu .
Stephen Kitt

6

Oturum açtığınızda, stdin, stdout ve stderr oturum açtığınız terminale bağlanır. Daha kesin olmak gerekirse, tty tipik olarak açılır ve stdout ve stderr dup(2)ilk dosya tanımlayıcıdaki iki işlemin sonucudur . Bu, terminalden girdi almak için stderr'den okumaya izin verir.

Diğer cevapta belirtildiği gibi, programlar bir soruya interaktif bir cevap almak için stderr'den okurlar .

Kullanıcı hangi koşullar altında bir programın stderr'den okuduğunu bilemediğinden, başka bir programdan stderr'a kasıtlı olarak veri yazmak gereksiz bir girişimdir.

Bugün programların genellikle ilk olarak /dev/ttyyalnızca çalışmadığı takdirde stderr'yi açmaya ve kullanmaya çalıştığını unutmayın.

Yalnızca stderr'den okunan programlar genellikle 1979'dan önce hiç değiştirilmemiştir ve bu tür programlar genellikle aşağıdaki gibi yapıları içerir:

int i 1;

veya

i =* 2;

modern C derleyicileri tarafından kabul edilmez. Sonuç olarak, bugün hiç açılmayan, /dev/ttyancak stderr'den etkileşimli yanıtları okuyan bir program bulmanız pek olası değildir .


Eğer doğru anlıyorsam , yeniden yönlendirildiğinde (boru veya başka yollarla) kabuk stderrtty'ye bağlanır stdin? Yoksa her zaman stderrtty'ye mi bağlanır ?
Draconis

1
Giriş yaptığınızda, stderr giriş terminalinize bağlanır.
Schily

2
i =+ 1tamamen geçerli C ve eşittir i = (+1). Verilmiş, birincisi el yapımı C yarışması için güzel bir aday.
G. Sliepen

1
Tamam, sadece bir uyarı oluşturuyor olabilir. Kodu 1977'de C'den başka bir şeye değiştirdim.
schily

1
O zamandan beri, daha kabukları farkındayım görünüyor ben do standart girdi dışındaki okur en az bir kabuk biliyorum . (-:
JdeBP
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.