STDOUT ve STDIN'i bağlayarak ne kastedilmektedir?


10

Bir kitap okuyorum, diyor ki:

Her süreçte kullanılabilecek en az üç iletişim kanalı vardır: “standart giriş” (STDIN), “standart çıkış” (STDOUT) ve “standart hata” (STDERR).

Çoğu komut STDIN'den girdilerini kabul eder ve çıktılarını STDOUT'a yazar. STDERR'a hata mesajları yazarlar. Bu kural, kompozit boru hatları oluşturmak için komutları yapı taşları gibi bir araya getirmenizi sağlar.

Kabuk sembolleri yorumladığı <, >ve >>talimatlara olarak veya bir dosyadan, bir komutun giriş veya çıkışı yönlendirmeye.

Bir komutun STDOUT'unu bir diğerinin STDIN'ine bağlamak için | , genellikle boru olarak bilinen sembolü kullanın .

ps -ef | grep httpd

Temel olarak bunun söylediği, standart girdinin kullanıcının bir dosyaya yazmasına izin veren bir komut olması, standart çıktı ise kabuğa bash kabuğu yazma çıktısına sahip bir komuttur ve standart hata sadece çıktı gibidir. dosya sisteminde bir hata olduğunda çağrılır. Sonra STDOUT ve STDIN'i bağlama kısmına geçiyoruz ve kayboldum.

Yanıtlar:


25

Standart giriş ve standart çıkış komut değildir.

Montaj hattına sahip bir fabrikada komutları makine olarak düşünün. Çoğu makine, verileri beslemek için bir konveyör bandına ve verileri beslemek için bir konveyör bandına sahip olacak şekilde tasarlanmıştır; bunlar sırasıyla standart girdi ve standart çıktıdır. Standart hata, makinenin yan tarafında reddedilebilecek bir açıklıktır.

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

Yukarıdaki şemada iki makineden geçen bir taşıma bandı gösterilmektedir. Veriler soldaki giriş rezervuarından gelir, A makinesine beslenir, daha sonra çıkış B makinesine (girdi olduğu) daha fazla iletilir ve B makinesinin çıkışı sağdaki çıkış kovasında depolanır.

Unix açısından buna boru hattı denir . Metafor sıhhi tesisattır: bir boru A makinesini B makinesine bağlar. Yukarıdaki boru hattı için kabuk sözdizimi şöyledir:

<input-file.txt commandA | commandB >output-file.txt

< Yönlendirme sembol bağlamak için kabuk söyler commandAdosyaya asaati girdi input-file.txtbaşlatmadan önce commandA. (Yeniden yönlendirmeyi komut adının önüne veya arkasına koyabilirsiniz.) Yeniden >yönlendirme sembolü kabuğa commandBstandart çıkışın bağlanmasını bildirir output-file.txt. |Ortadaki boru (" ") sembolü, kabuğa başlatmadan önce commandAstandart çıkışını commandBstandart girişine bağlamasını söyler .

Komutların birden fazla girişi ve birden fazla çıkışı olabilir, ancak bu başka bir gün için önemlidir .


3
Görsel çok yardımcı oldu
JohnMerlino

Güzel benzetme. Uzun yıllardır akış boru hattı kavramını anladım, ancak hiç kimse fabrika / konveyör benzetmesini hiç kullanmadı, bu da onu kolayca (ve kısa bir şekilde) anlaşılabilir hale getirdi. Teşekkür ederim!
Owen Blacker

1
Büyük benzetme. Sakıncası yoksa bunu ödünç alacaksın.
Tivie

Gilles, en alttaki ifadenizle ilgili bir soru sordum: unix.stackexchange.com/q/96724/29146 . açıklayabilir misiniz?
Strugee

@Gilles - Komuttan önce veya sonra yeniden yönlendirmeyi tanımlama seçeneğini gösteren bir örnek ekleyebilir misiniz? Örneğin, boru hattı input-file.txt> commandA veya input-file.txt <commandA olarak okuyabilir mi?
Motive

6

standard input is a command that allows user to write to a file

Bir komut değil, bir akış. Standart giriş ve çıkış posta kutuları gibidir. Bir program başladığında, almak için bir kutu ve posta göndermek için bir kutu verilir. Genellikle, giriş klavyeden gelir ve kutuya konur, kutuya konulan posta terminal ekranınızda sona erer.

standard output is a command that has the bash shell write output to the shell

Program aslında standart çıkış noktalarının nerede olduğunu bilmiyor. A'dan B'ye boru $ A | Bhattını bağladığınızda (olduğu gibi ), A postaları kutuya koyduğunda, kutu B'nin kutusunda olur. B girişi işler ve kendi postasını terminalde gördüğünüz kutuya koyar.

Metaforu düşürmek için, belirtildiği gibi, standart giriş / çıkış akışlardır. Posta kutusu veya dosya tanımlayıcı , akışın bir ucudur. Boru, A'nın dışındaki standardı B'deki standarda bağlamaktır.

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.