Çoklu standart giriş? Nasıl?


36

Bu commandlinefu yayınından :

$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)

Birden fazla standart giriş gibi görünüyor ancak --- eğer Linux Porgramming kursumu doğru hatırlıyorsam --- bu olamaz. Tanım olarak standart girdinin bir akış olduğunu düşünmüştüm.

Belki de bunun stdin ile ilgisi var. Birisi bunu bana açıklayabilir mi; belki de dokümantasyona link verebilirsin.

Bonus: Bir script bu çoklu akışları nasıl ele alır? Birisi bir Python veya Perl örneği sağlayabilirse, bu çok yardımcı olacaktır.


1
İyi soru. Farkında değilseniz, bir unix / linux Soru ve Cevap sitesi var: unix.stackexchange.com
Matt Ellen


Not: Bash'te <(…); Zsh işleminde ikame sözdizimi var =(…).
Kamil Maciorowski

Yanıtlar:


27

Bu çoklu standart girdi değil. Bu, 'İkame Süreci' denilen bir fahişedir http://tldp.org/LDP/abs/html/process-sub.html

/dev/fd/somethingHer ikame için sözde bir dosya ( ) oluşturur . Oldukça faydalı. Komut yalnızca bir akış olarak okuyabilir, bu da fseek ile ileri ve geri dönemeyeceği anlamına gelir. Bir boru gibi bir bayt akışı olarak okuması gerekiyor.

BONUS Cevap

Bunu kullanmak için fazla bir şey yapmanıza gerek yok. Komut dosyanız söz konusu olduğunda, komut satırında geçerli bir dosya adı alır; bu, başka herhangi bir şey gibi açık () olabilir. Diğerlerinin dediği gibi, görürsünüz diff /dev/fd/XX /dev/fd/YY. Bu sözde dosyalardan herhangi birine bir stat () yaparsanız, bunun adlandırılmış bir boru olduğunu görürsünüz ve boru anlambilimiyle - yani fseek () veya ftell () kullanmamalısınız. Bunu bir dosya (örneğin eğer açıkça görmek için bir stat () testi yaparsanız [ -f $1 ]bu) olur kırmak - bu sonuçta bir adlı kanal olarak uygulanmaktadır.


Bash işleminin ikame edilmesi için başka bir iyi referans - wiki.bash-hackers.org/syntax/expansion/proc_subst
studgeek

Ve bu özelliğin önerilen kullanımı nedir? Programınız rastgele erişime sahip bir dosya gerektirmek yerine bir akışla makul bir şekilde çalışabiliyorsa bunu destekleyin.
masterxilo

7

<(...)bash'te ikame işlemini yapar . Parens içindeki işlem çıktısı normal 3'ün ötesinde ek bir dosya tanımlayıcısına gönderilir ve bu dosya tanımlayıcısına karşılık gelen bir dosya adı döndürülür. Bu şekilde bir komutun çıktısı başka bir komuta geçirilecek bir dosya adı olarak değerlendirilebilir.


7

Her işlem için bir stdintane var . Genellikle terminale bağlanırlar, ancak birbirlerinden ayrı olarak yönlendirilebilirler.stdout

Örnekte wget, her biri kendine özgü stdinve olmak üzere iki süreç vardır stdout. Her wgetsüreç -, kendi olanına yazar stdout. Ardından, bashişlem değiştirme işlemi , işlemi okuyabileceği benzersiz bir sahte dosyaya <(...)bağlar . İki işlem değişiminin iki farklı sözde dosya verdiğini unutmayın ! Böylece, bir şey görür:stdoutdiffdiff

diff /dev/fd/XX /dev/fd/YY

burada stdoutarasında wget -q -O - URL1bağlanır /dev/fd/XX, ve stdoutbir wget -q -O - URL2için /dev/fd/YY.

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.