Rai*_*ahs 11 shell bash quoting gnu-parallel
% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
Run Code Online (Sandbox Code Playgroud)
我希望第二行的行为相同。
Sté*_*las 13
parallel运行在一个壳中的命令已经(其壳是由下式确定parallel使用试探(其意图是调用相同的外壳作为一个parallel被调用从)。可以设置$PARALLEL_SHELL变量固定壳)。
它不是parallel像envorxargs命令那样传递给的命令,而是 shell 命令行(就像你对eval命令那样)。
像eval中parallel arg1 arg2,parallel被串联用空格这些参数之间(因此它成为arg1 arg2)和字符串传递给<the-shell> -c。
对于在parallel's stdin上传递的参数,parallel以该特定 shell 期望的格式引用它们(这是一项困难且容易出错的任务,这就是为什么您会发现在parallel's Changelog (截至 2017 年 3 月 6 日),有些仍未修复)并将其附加到该命令行。
因此,例如,如果从内部调用bash,
echo "foo'bar" | parallel echo foo
Run Code Online (Sandbox Code Playgroud)
将bash -c与echo foo foo\'bar命令行并行调用。如果从内部rc(或 with PARALLEL_SHELL=rc)调用rc -cwith echo foo foo''''bar.
在你的:
parallel bash -c 'echo :\$1' '' {}
Run Code Online (Sandbox Code Playgroud)
parallel 连接那些给出的参数:
bash -c echo :$1 {}
Run Code Online (Sandbox Code Playgroud)
而随着{}在你打电话的外壳正确的格式扩展,并引述parallel来自传递,要<that-shell> -c其将调用bash -c echo同:$1在$0,并在目前的争论$1。
这不是如何parallel运作的。在这里,您可能想要:
printf '1\n2\n' | PARALLEL_SHELL=bash parallel 'echo :{}'
Run Code Online (Sandbox Code Playgroud)
要查看有什么parallel作用,您可以在strace -fe execve(或者如果不是 Linux 的情况下在您的系统上运行它)。
在这里,您可以使用 GNUxargs而不是parallel获得更接近您期望的更简单的处理:
printf '1\n2\n' | xargs -rn1 -P4 bash -c 'echo ":$1"' ''
Run Code Online (Sandbox Code Playgroud)
另请参阅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
Run Code Online (Sandbox Code Playgroud)
和。
$ bash -c 'echo x > "$1"' bash /
bash: /: Is a directory
Run Code Online (Sandbox Code Playgroud)
还要注意的是未加引号的离开有着非常特殊的意义的变量bash,并且echo通常不能用于任意数据。
| 归档时间: |
|
| 查看次数: |
1320 次 |
| 最近记录: |