2017-05-06 3 views
2

Ich habe ein Problem beim Aufruf von xargs in einem Bash-Skript, um den Start einer Funktion zu parallelisieren.xargs bash -c unerwartetes Token

Ich habe diese Zeile:

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

, die die Funktion startet doSqoop, die ich vorher exportiert.
Ich gehe zu xargs und dann zu bash -c eine einzelne, sehr lange Zeile, die Felder enthält, die ich innerhalb der Funktion spalte und handle.
Es ist etwas wie schema|tab|dest|desttab|query|splits|...., die ich aus einer Datei gelesen habe, über den grep Befehl oben. Mir geht es gut mit dieser Lösung, ich weiß, dass Xargs die Linie auf | teilen können, aber ich bin ok auf diese Weise.

Es wird verwendet, um gut zu funktionieren, da ich am Ende ein weiteres Feld hinzuzufügen hatte, was diese Art von Wert enthält:

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

Jetzt habe ich diesen Fehler: bash: -c: line 0: syntax error near unexpected token '('

Ich habe versucht, der Pharhatese und einfachen Anführungszeichen zu entgehen, ohne Erfolg.
Es scheint mir, dass bash -c interpretiert die Argumente

+2

Warum 'xargs .... bash -c" doSqoop 'args "" '? Ist es nicht das gleiche wie 'xargs .... doSqoop args'? – user000001

+0

Ich brauche es, um eine Funktion zu nennen, die im Skript enthalten ist (die ich exportiert habe), andernfalls würden xargs versuchen, doSqoop als externen Befehl auszuführen. – Omar

+1

Dann wäre es besser, 'xargs' mit GNU parallel zu ersetzen, das mit exportierten Funktionen arbeiten kann. – user000001

Antwort

1

Verwenden Sie GNU parallel, die exportierte Funktionen aufrufen kann, und hat auch eine einfachere Syntax und viel mehr Funktionen.

sollte Ihr Beispielbefehl mit

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

-Test mit folgenden Skript ersetzt werden könnte:

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

Sie auch die Anzahl der Prozesse mit der -P Option verwenden können, sonst ist es die Anzahl der Spiele Kerne in Ihrem System:

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

Verbringen Sie eine Stunde durch 'man parallel_tutorial'. Ihre Befehlszeile wird Sie dafür lieben. '--colsep '\ |'' kann von besonderem Interesse sein. –