2011-07-12 64 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 `;' 

上述命令中的語法錯誤是什麼?我也嘗試使用{},並用;結束了管道命令。但同樣的錯誤顯示出來...使用&符號在後臺運行bash管道命令

+1

下面的答案之間的區別是,'{}'在當前外殼上下文中執行。 '()'創建一個新的子shell,所以你不保留變量賦值。 – Tathagata

回答

15

如果你想在後臺並行運行所有的作業,你應該把&放在()之內。

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

這是因爲& and ;都是命令分隔符:[http://stackoverflow.com/questions/12034909/why-do-i-get-unexpected-token] – Campa

+0

如何獲得這種格式的最後一個命令的pid?這是行不通的:「uniq_pid = $!」 – Pixar

16

可以包括在護腕的&:

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

Thanks @ IcanDivideBy0 ...但只能接受一個答案。尼斯尼克BTW:D – Tathagata

+4

@Thahagata:你可以得到這個答案給海報10代表。 –

+0

Thanks @larsmans ... upvoted your tip。:) – Tathagata

11

&是一個分離器,所以是冗餘的; I.E.刪除最後的;

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

+1用於消除無用的貓和'sort -u' – exic