2011-07-12 8 views
10
time for i in `ls /tmp/chunk*`; do (cat $i | tr ' ' '\n' | sort | uniq > /tmp/line${i:10}) & ;done 
bash: syntax error near unexpected token `;' 

Co błąd składni w powyższym poleceniu? Próbowałem również używać {} i zakończyłem wyprowadzanie poleceń za pomocą ;. Ale ten sam błąd pojawia się ...uruchamianie poleceń potoku bash w tle za pomocą & ampersand

+1

Różnica między poniższymi odpowiedziami polega na tym, że '{}' jest wykonywane w bieżącym kontekście powłoki. '()' Tworzy nową podpowłokę, więc nie zachowujesz przypisań zmiennych. – Tathagata

Odpowiedz

15

Powinieneś umieścić & wewnątrz (), jeśli chcesz uruchomić wszystkie zadania równolegle w tle.

time for i in `ls /tmp/chunk*`; do 
    (cat $i | tr ' ' '\n' | sort | uniq > /tmp/line${i:10} &) 
done 
+0

To dlatego, że & and ; są separatorami poleceń: [http://stackoverflow.com/questions/12034909/why-do-i-get-nexpected-token] – Campa

+0

Jak uzyskać pid ostatniego polecenia w tym formacie? To nie zadziała: "uniq_pid = $!" – Pixar

16

Można zawierać & w bransolety:

time for i in `ls /tmp/chunk*`; do 
    {(cat $i | tr ' ' '\n' | sort | uniq > /tmp/line${i:10}) &}; 
done 
+0

Dzięki @ IcanDivideBy0 ... ale można przyjąć tylko jedną odpowiedź. Miły nick BTW: D – Tathagata

+4

@Tathagata: możesz przejąć tę odpowiedź, aby dać plakatowi 10 powtórzeń. –

+0

Dzięki @larsmans ... również awansowała Twoja wskazówka :) :) – Tathagata

11

& jest separator i tak jest zbędny z; I.E. usunąć finał;

for i in /tmp/chunk*; do tr ' ' '\n' <$i | sort -u > /tmp/line${i:10}& done 
+2

+1 za usunięcie bezużytecznego użycia kota i "sort -u" – exic

Powiązane problemy