2012-08-11 61 views
37

Birden çok komutun stdout'unu tek bir komutla nasıl alabilirim?Tek bir komutla çoklu komutları tek tek

Örnek 1: birleştirmek ve üç yankı komutları çıkış sıralamak:

echo zzz; echo aaa; echo kkk 

istenen çıkış:

aaa 
kkk 
zzz 

Örnek 2: tüm komutlar tek içinde olacak şekilde, aşağıdaki yeniden geçici bir dosyaya yönlendirmeler olmadan komut satırı kullanarak komut satırı:

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo 

cevap

66

Parantez kullanın() 's Komutları, her birinin stdoutunu birleştirecek olan tek bir işlem halinde birleştirin.

Örnek 1 ($ kabuk istemi olduğuna dikkat edin):

$ (echo zzz; echo aaa; echo kkk) | sort 
aaa 
kkk 
zzz 


Örnek 2: (echo zzz & echo aaa & echo kkk) | sort

Veya eğer: o aşağıdaki gibi olacaktır Windows

(setopt; unsetopt; set) | sort 
+12

+1. Ayrıca bir alt kabuk oluşturmayan parantezleri de kullanabilirsiniz. Sözdizimi biraz daha katı: '{setopt; unsetopt; set; } | sıralama | daha az - parantezin etrafındaki boşluk ve sondaki noktalı virgül gereklidir. –

+6

@glenn: Bu farketmez (bash 3.2.48'de test edilmiştir), çünkü boru hattı zaten bir alt kanala zorlar. –

+1

'$' komutunun, komutun bir parçası olmadığına dikkat çekilmelidir. – Gilly

0

Bir toplu iş dosyasının içinde, mono satır (örnek gibi) ve ayrıca çok satırlı olabilir:

(
echo zzz 
echo aaa 
echo kkk 
) | sort 

Not: söz etmez orijinal yayın sadece Linux için, yani Windows komut satırı için bir çözüm eklendi ... komut içindeki diskpart (echo diskpart_command) ile VHD/VHDX çalışırken çok yararlıdır yerine yankı aynı, ama orada echo izin, ekosuz ve > yeniden yönlendirici ile başka bir yolu var, ama hatalara çok eğilimli ve yazmak için çok daha karmaşık (neden karmaşık bir eğilimi kullanmak için neden karmaşık bir eğilimi kullanın) allways iyi çalışır basit bir şekilde) ... Ayrıca %d% hatırla gerçek yol (VHD/VHDX dosyaları yolunu kodlamak için çok yararlı) verir.

7

Bunun için {} kullanabilir ve böylece, (list) gibi bir alt kabuk ihtiyacını ortadan kaldırabilir:

{ echo zzz; echo aaa; echo kkk; } | sort 

Biz { sonra ve } önce boşluk karakteri gerekiyor. Sıra tek bir satıra yazıldığında son ;'a da ihtiyacımız var.

Ayrıca, herhangi ; gerek kalmadan birden fazla satır olarak yazabiliriz:

Örnek 1:

{ 
    echo zzz 
    echo aaa 
    echo kkk 
} | sort 

Örnek 2:

{ 
    setopt 
    unsetopt 
    set 
} | sort 
İlgili konular