% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
Je m'attendrais à ce que la deuxième ligne agisse de la même façon.
% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
Je m'attendrais à ce que la deuxième ligne agisse de la même façon.
Réponses:
parallel
exécute déjà la commande dans un shell (de quel shell il s'agit, déterminé à l' parallel
aide d'heuristiques (l'intention étant d'appeler le même shell que celui à partir duquel vous avez parallel
été invoqué ). Vous pouvez définir la variable pour corriger le shell).$PARALLEL_SHELL
Ce n'est pas une commande que vous passez parallel
comme vous le feriez pour la commande env
ou xargs
, mais une ligne de commande shell (comme vous le feriez pour la eval
commande).
Comme pour eval
, dans parallel arg1 arg2
, parallel
concatène ces arguments avec des espaces entre les deux (donc cela devient arg1 arg2
) et cette chaîne est passée à <the-shell> -c
.
Pour les arguments qui sont passés sur parallel
stdin, les parallel
cite dans le format attendu par ce shell particulier (une tâche difficile et sujette aux erreurs, c'est pourquoi vous constaterez qu'il y a eu beaucoup de bugs corrigés autour de cela dans parallel
le journal des modifications ( certains ne sont toujours pas corrigés au 06/03/2017)) et l'ajoutent à cette ligne de commande.
Ainsi, par exemple, s'il est appelé de l'intérieur bash
,
echo "foo'bar" | parallel echo foo
Aurait un appel parallèle bash -c
avec echo foo foo\'bar
comme ligne de commande. Et s'il est appelé de l'intérieur rc
(ou avec PARALLEL_SHELL=rc
) rc -c
avec echo foo foo''''bar
.
Dans ton:
parallel bash -c 'echo :\$1' '' {}
parallel
concatène les arguments qui donnent:
bash -c echo :$1 {}
Et avec le {}
développé et cité dans le bon format pour le shell à parallel
partir <that-shell> -c
duquel vous appelez , passe ce à qui appellera bash -c echo
avec :$1
in $0
et l'argument actuel dans $1
.
Ce n'est pas comme ça que ça parallel
marche. Ici, vous voudriez probablement:
printf '1\n2\n' | PARALLEL_SHELL=bash parallel 'echo :{}'
Pour voir ce qui se parallel
passe, vous pouvez l'exécuter sous strace -fe execve
(ou l'équivalent sur votre système si ce n'est Linux).
Ici, vous pouvez utiliser GNU xargs
au lieu de parallel
rapprocher un traitement plus simple de ce que vous attendez:
printf '1\n2\n' | xargs -rn1 -P4 bash -c 'echo ":$1"' ''
Voir également la discussion sur https://lists.gnu.org/archive/html/bug-parallel/2015-05/msg00005.html
Notez que dans bash -c 'echo foo' '' foo
, vous créez $0
la chaîne vide pour ce script en ligne. J'éviterais cela car cela $0
est également utilisé dans les messages d'erreur. Comparer:
$ bash -c 'echo x > "$1"' '' /
: /: Is a directory
avec.
$ bash -c 'echo x > "$1"' bash /
bash: /: Is a directory
Notez également que laisser des variables sans guillemets a une signification très spéciale dans bash
et qui echo
ne peut généralement pas être utilisé pour des données arbitraires.