2011-01-19 25 views
11

İki dosya üzerinde çalışmak üzere tasarlanmış birkaç unix komutu vardır. Yaygın olarak bu tür komutlar, dosya adının yerine tek bir tire kullanılarak "dosyalardan" birinin içeriğinin standart girişten okunmasına izin verir.İki dosyayı standart girişe yönlendiriliyor

Sadece iki dosya standart girdiden okunmasına izin görünüyor a technique rastladı.

Benim ilk inkarcı tepki
comm -12 <(sort file1) <(sort file2) 

, "iş olmamalı Standart giriş concatenation gereken sadece edecek her iki dosyada, dosyalar dosyaları ayrı ayrı anlatamaz ve hatta iki dosyanın içeriğinin verildiğini fark edemez. "

Elbette, bu inşaat işe yarıyor. Ben her iki comm ve diff cygwin 1.7.7 üzerinde bash 3.2.51 kullanarak test ettik. Nasıl ve neden işe yaradığını merak ediyorum:

  • Neden bu işe yarar?
  • Bu bir Bash uzantısı mıdır, yoksa bu düz Bourne kabuğu işlevi mi?
  • Bu, sistemimde çalışır, ancak bu teknik diğer platformlarda çalışır mı? (Başka bir deyişle, bu teknik kullanılarak yazılmış komut dosyaları taşınabilir olacak mı?)

cevap

9

Bash, Korn kabuğu ve Z'nin tüm desteği process substitution kabuk. Bunlar, yardımcı programa dosyalar olarak görünür. Bunu deneyin:

$ bash -c 'echo <(echo)' 
/dev/fd/63 
$ ksh -c 'echo <(echo)' 
/dev/fd/4 
$ zsh -c 'echo <(echo)' 
/proc/self/fd/12 

Gösterilenlere benzer dosya tanıtıcılarını göreceksiniz.

+0

İşte bu - süreç ikamesi! Yeniden yönlendirme hakkında bilgi almak için çok zaman harcadım, ama yanlış ismim vardı. –

+0

Teşekkürler. Bu yardımcı oldu. Onaylanmış ksh88 (AIX 7.1 üzerinde) bu süreç ikamesini desteklememektedir. Bash için teşekkürler Ganesh. –

4

Bu, standart bir Bash uzantısıdır. <(sort file1), sort file1 komutunun çıktısını içeren bir boruyu açar, boruyu geçici bir dosya adı verir ve bu geçici dosya adını comm komut satırında geçirir.

Bunu programa geçirilen neler olduğunu anlatmak için echo alarak nasıl çalıştığını görebilirsiniz: (Zaten ksh93)

echo <(sort file1) <(sort file2) 
İlgili konular