2012-08-11 17 views
37

Jak wypakować standardowe wyjście wielu poleceń do pojedynczego polecenia?Przetwarzanie wielu poleceń w jednym poleceniu

Przykład 1: połączyć i sortowania wyników ze wszystkich trzech echa poleceń:

echo zzz; echo aaa; echo kkk 

sygnał wyjściowy:

aaa 
kkk 
zzz 

Przykład 2: przepisać następujące tak, że wszystkie rozkazy są pojedyncze wiersza polecenia za pomocą potoków, bez przekierowań do pliku tymczasowego:

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

Odpowiedz

66

Użyj nawiasów() do połącz komendy w jeden proces, który połączy stdout każdego z nich.

Przykład 1 (zauważ, że $ jest znak zachęty):

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


Przykład 2:

(setopt; unsetopt; set) | sort 
+12

+1. Możesz również użyć nawiasów klamrowych, które nie spawną podpowłok. Składnia jest nieco bardziej ścisła: '{setopt; unsetopt; zestaw; } | sortuj less' - wymagane są białe spacje wokół nawiasów i kończący średnik. –

+6

@glenn: to nie ma znaczenia (testowane w bashu 3.2.48), ponieważ rurociąg w każdym razie zmusza go do podpięcia. –

+1

Należy zauważyć, że '$' jest podpowiedzią, a nie częścią polecenia – Gilly

0

W Windows byłoby następujące: (echo zzz & echo aaa & echo kkk) | sort

lub jeśli to jest w pliku wsadowym może to być linia mono (jak przykład), a także multilinii:

(
echo zzz 
echo aaa 
echo kkk 
) | sort 

Uwaga: Oryginalny post nie wspomnieć o tym jest tylko dla Linuksa, więc dodałem rozwiązanie dla linii poleceń systemu Windows ... to jest bardzo przydatne podczas pracy z VHD/VHDX z diskpart wewnątrz skryptów (echo diskpart_command) zamiast echa na tym samym, ale niech to jest echo, jest też inny sposób bez echa iz readresorem >, ale jest bardzo podatny na błędy i o wiele bardziej skomplikowany w pisaniu (po co używać skomplikowanej skłonności do błędów, jeśli istnieje prosty sposób, który zawsze działa dobrze) ... pamiętaj też, że %d% podaje aktualną ścieżkę (bardzo przydatne, aby nie kodować na sztywno ścieżki plików VHD/VHDX).

7

Można użyć {} dla tego i wyeliminować potrzebę sub-shell jak w (list), tak:

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

Potrzebujemy spacją po { i przed }. Potrzebujemy również ostatniego ;, kiedy sekwencja jest zapisana w jednej linii.

Możemy również zapisać go na wielu liniach, bez potrzeby jakiejkolwiek ;:

Przykład 1:

{ 
    echo zzz 
    echo aaa 
    echo kkk 
} | sort 

Przykład 2:

{ 
    setopt 
    unsetopt 
    set 
} | sort 
Powiązane problemy