% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
我希望第二行也一样。
% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
我希望第二行也一样。
Answers:
parallel
运行在一个壳中的命令已经(其壳是由下式确定parallel
使用试探(其意图是调用相同的外壳作为一个parallel
被调用从)。可以设置$PARALLEL_SHELL
变量固定壳)。
这不是传递给parallel
您的命令,就像传递给env
or xargs
命令一样,而是一个Shell命令行(就像传递给该eval
命令一样)。
就像for eval
in 一样parallel arg1 arg2
,parallel
将这些参数之间用空格连接起来(这样就变成了arg1 arg2
),并将该字符串传递给<the-shell> -c
。
对于在parallel
stdin 上传递的参数,请parallel
以该特定shell期望的格式引用它们(这是一个困难且容易出错的任务,这就是为什么您会发现在parallel
Changelog中对此存在很多错误的修正(某些仍然没有固定为2017年3月6日的)),并将其追加到该命令行。
例如,如果从内部调用bash
,
echo "foo'bar" | parallel echo foo
本来并行调用bash -c
与echo foo foo\'bar
作为命令行。如果从内部被称为rc
(或PARALLEL_SHELL=rc
)rc -c
使用echo foo foo''''bar
。
在你的:
parallel bash -c 'echo :\$1' '' {}
parallel
将这些参数串联起来,得到:
bash -c echo :$1 {}
并以{}
正确的格式为您parallel
要从<that-shell> -c
其调用的shell 进行扩展和引用,将传递给将bash -c echo
使用:$1
in $0
和当前参数in 调用的shell $1
。
不是这样的parallel
。在这里,您可能想要:
printf '1\n2\n' | PARALLEL_SHELL=bash parallel 'echo :{}'
要查看其parallel
作用,可以在strace -fe execve
(如果不是Linux则在系统上)下运行它。
在这里,您可以使用GNU xargs
而不是parallel
使更简单的处理接近您的期望:
printf '1\n2\n' | xargs -rn1 -P4 bash -c 'echo ":$1"' ''
另请参见https://lists.gnu.org/archive/html/bug-parallel/2015-05/msg00005.html上的讨论
请注意,在中bash -c 'echo foo' '' foo
,您正在$0
为该内联脚本创建空字符串。我会避免这种情况,因为它$0
也用于错误消息中。相比:
$ bash -c 'echo x > "$1"' '' /
: /: Is a directory
用。
$ bash -c 'echo x > "$1"' bash /
bash: /: Is a directory
还要注意的是未加引号的离开有着非常特殊的意义的变量bash
,并且echo
通常不能用于任意数据。