it-swarm.com.de

Shell-Funktionen mit xargs aufrufen

Ich versuche, xargs zu verwenden, um eine komplexere Funktion parallel aufzurufen. 

#!/bin/bash
echo_var(){
    echo $1
    return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {} 
exit 0

Dies gibt den Fehler zurück

xargs: echo_var: No such file or directory

Irgendwelche Ideen, wie ich xargs verwenden kann, oder andere Lösungen, wären willkommen.

126
fac3

Das Exportieren der Funktion sollte dies tun (nicht getestet):

export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "[email protected]"' _ {}

Sie können das eingebaute printf anstelle des externen seq verwenden:

printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "[email protected]"' _ {}

Bei Verwendung von return 0 und exit 0 werden auch alle Fehlerwerte maskiert, die möglicherweise durch den vorangehenden Befehl erzeugt werden. Wenn es keinen Fehler gibt, ist es die Standardeinstellung und daher etwas überflüssig.

126

Die Verwendung von GNU Parallel sieht folgendermaßen aus:

#!/bin/bash
echo_var(){
    echo $1
    return 0
}
export -f echo_var
seq -f "n%04g" 1 100 | parallel -P 10 echo_var {} 
exit 0

Wenn Sie die Version 20170822 verwenden, müssen Sie nicht einmal export -f so lange Sie dies ausführen

. `which env_parallel.bash`
seq -f "n%04g" 1 100 | env_parallel -P 10 echo_var {} 
17
Ole Tange

So etwas sollte auch funktionieren: 

function testing() { sleep $1 ; }
echo {1..10} | xargs -n 1 | xargs [email protected] -P4 bash -c "$(declare -f testing) ; testing @ ; echo @ "
7
Eremite

Vielleicht ist dies eine schlechte Praxis, aber wenn Sie Funktionen in einem .bashrc oder einem anderen Skript definieren, können Sie die Datei oder zumindest die Funktionsdefinitionen mit der Einstellung allexport umbrechen:

set -o allexport

function funcy_town {
  echo 'this is a function'
}
function func_rock {
  echo 'this is a function, but different'
}
function cyber_func {
  echo 'this function does important things'
}
function the_man_from_funcle {
  echo 'not gonna lie'
}
function funcle_wiggly {
  echo 'at this point I\'m doing it for the funny names'
}
function extreme_function {
  echo 'goodbye'
}

set +o allexport
0
xdhmoore