/ Dev / stdout'u neden bir metin düzenleyicisiyle okuyamıyorum?


9

Linux'ta Her Şey Nasıl Bir Dosya TM olduğunu öğrenmeye başladım , bu da / dev / stdout'tan tam anlamıyla okursam ne olacağını merak etmeme neden oldu:

$ cat /dev/stdout 
^C
$ tail /dev/stdout 
^C

( ^CProgram askıda kaldıktan sonra beni öldürüyor).

Denediğimde vim, düşünülemez mesajı alıyorum: "/ dev / stdout" bir dosya değil. Gasp!

Peki ne veriyor, neden bu "dosyaları" okumaya çalıştığımda hangups veya hata mesajları alıyorum?


1
Vim'in bir dosyayı dikkate alması ve * nix içindeki "her şey bir dosyadır" (ilişkilendirilmiş ticari marka yok) ile kastedilen aynı şey değildir. Bkz. Örneğin # 1 ve # 2 .
goldilocks

Yanıtlar:


11

neden takılmaya başlıyorum

"Hangout'lar" alamıyorsunuz cat(1)ve tail(1)sadece okumaya engel oluyorlar. cat(1)girişi bekler ve tam bir satır görür görmez yazdırır:

$ cat /dev/stdout
foo
foo
bar
bar

İşte yazdım fooEnterbarEnterCTRL- D.

tail(1)girişi bekler ve yalnızca algılayabildiğinde yazdırır EOF:

$ tail /dev/stdout
foo
bar
foo
bar

İşte yine daktilo fooEnterbarEnterCTRL- D.

veya hata mesajları

Vim size hata veren tek kişidir. Bunu yapar, çünkü karşı çalışır ve biti ayarlanmadığını bulur .stat(2)/dev/stdoutS_IFREG

/dev/stdoutbir dosyadır, ancak normal bir dosya değildir . Aslında, çekirdeğe dosya sistemine bir giriş vermek için biraz dans var. Linux'ta:

$ ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 May  8 19:42 /dev/stdout -> /proc/self/fd/1

OpenBSD'de:

$ ls -l /dev/stdout
crw-rw-rw-  1 root  wheel   22,   1 May  7 09:05:03 2015 /dev/stdout

FreeBSD'de:

$ ls -l /dev/stdout
lrwxr-xr-x  1 root  wheel  4 May  8 21:35 /dev/stdout -> fd/1

$ ls -l /dev/fd/1
crw-rw-rw-  1 root  wheel  0x18 May  8 21:35 /dev/fd/1

5

(Neredeyse) her şey bir dosyadır, ancak her şey normal bir dosya değildir. Dizin, ağ soketi, seri bağlantı noktası vb.Gibi özel bir dosyada metin düzenleyiciyi çağırmak mantıklı değildir.

Dosya /dev/stdout, unix değişkenine bağlı olarak birkaç şeyden biri olabilir:

  • “özel” bir dosya, tipik olarak bir karakter cihazı;
  • erişen işlemin bu tanımlayıcıda açık olduğu dosyayı gösteren “sihirli” sembolik bir bağlantı;
  • yukarıdakilerden birine sembolik bir bağlantı.

Her durumda, açılış /dev/stdoutve benzeri dosyalar, uygulamanın dosya tanımlayıcı 1'de zaten açık olduğu aynı dosyayla ilişkili yeni bir dosya tanımlayıcı oluşturur. "Standart çıktı", dosya tanımlayıcı 1 anlamına gelir ve bu dosya tanımlayıcısının kullanıldığı yalnızca bir kuraldır çıktı için - çekirdek umursamaz.

Terminalde bir program çalıştırdığınızda, üç standart tanımlayıcının tümü (0 = standart giriş, 1 = standart çıkış, 2 = standart hata) terminal aygıtında açılır. Bu cihazdan okumak, kullanıcı tarafından yazılan karakterleri döndürür ve o cihaza yazmak terminal penceresinde metin görüntüler. (Bir terminal cihazı göz önüne alındığında, gösterdiği çıkışı okumak veya içine veri enjekte etmek için standart bir yol yoktur.)

Eğer çalıştırdığınızda cat /dev/stdout, bu tam olarak aynı şeyi yapar cat /dev/stdinveya cat /dev/stderrbu üç dosya tanımlayıcıları aynı dosyaya bağlı olduğumuzdan: o söyler catterminalinden okumak için. Yani ne cathayır argüman ile çok yapar.

Eğer koştuysanız cat /dev/stdout >foo, /dev/stdoutdosyaya atıfta bulunursunuz foo- bu komut eşdeğerdir cat foo >foo. Uygulamaya bağlı olarak cathata verebilir (GNU sürümü “girdi dosyasının çıktı dosyası” olduğundan şikayet eder) veya fooboş olan dosyadan okuduğu için (hiçbir şey kesilmez) hiçbir şey yapamaz >foo. Bunun bir sürümü catbu özel durumu algılamazsa, fooboş değilse, o zaman cat /dev/stdout >>fooveya eşdeğeri cat foo >>foodosyanın içeriğini süresiz olarak kendisine ekler.

Çalıştırdığınızda vim /dev/stdout, bir terminalin nasıl düzenleneceğini bilmediği için şikayet ediyor (bu sadece mantıklı değil).


2

catve tailisteğe bağlı içerik ve ardından bir dosya sonu arıyorlar. /dev/stdoutböylece, açık kalır catve tailsadece aramaya devam edin.

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.