2017-05-06 21 views
2

我遇到了在bash腳本中調用xargs以並行啓動函數的問題。xargs bash -c意外標記

我有這樣一行:

grep -Ev '^#|^$' "$listOfTables" | xargs -d '\n' -l1 -I args -P"$parallels" bash -c "doSqoop 'args'" 

會啓動,我以前導出功能doSqoop
我傳遞給xargs,然後傳遞給bash -c一個很長的行,包含我在函數內部分割和處理的字段。
這是類似schema|tab|dest|desttab|query|splits|....,我通過上面的grep命令從文件中讀取。我對這個解決方案很好,我知道xargs可以在|上劃線,但我可以這樣。

它曾經工作得很好,因爲我不得不在最後添加一個字段,其中包含這樣的值:

field1='varchar(12)',field2='varchar(4)',field3='timestamp',....

現在我有這樣的錯誤: bash: -c: line 0: syntax error near unexpected token '('

我試着逃避pharhentesis和單引號,沒有成功。
在我看來,bash -c正在解釋的論據

+2

爲什麼'xargs .... bash -c「doSqoop'args'」'?與xargs .... doSqoop args'不一樣嗎? – user000001

+0

我需要它調用腳本中包含的函數(我導出的),否則xargs會嘗試執行doSqoop作爲外部命令。 – Omar

+1

然後用GNU parallel替換'xargs'會更好,可以使用導出的函數。 – user000001

回答

1

使用GNU並行,可以調用導出的函數,也有一個更簡單的語法和更多的功能。

你的樣本命令應該可以用

grep -Ev '^#|^$' file | parallel doSqoop 

測試下面的腳本來代替:

#!/bin/bash 
doSqoop() { 
    printf "%s\n" "[email protected]" 
} 
export -f doSqoop 
grep -Ev '^#|^$' file | parallel doSqoop 

您還可以設置與-P選項進程的數目,否則它的數量相匹配核心在你的系統中:

grep -Ev '^#|^$' file | parallel -P "$num" doSqoop 
+0

花一個小時漫步'man parallel_tutorial'。你的命令行會愛你。 '--colsep'\ |''可能特別感興趣。 –