为什么 GNU 并行不能与“bash -c”一起使用?

莱蒂斯·韦恩巴什
% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}


%

我希望第二行的行为相同。

斯蒂芬·查泽拉斯

parallel运行在一个壳中的命令已经(其壳是由下式确定parallel使用试探(其意图是调用相同的外壳作为一个parallel被调用)。可以设置$PARALLEL_SHELL变量固定壳)。

它不是parallelenvorxargs命令那样传递给命令,而是 shell 命令行(就像你对eval命令那样)。

evalparallel arg1 arg2parallel被串联用空格这些参数之间(因此它成为arg1 arg2)和字符串传递给<the-shell> -c

对于在parallel's stdin上传递的参数,parallel以该特定 shell 期望的格式引用它们(这是一项困难且容易出错的任务,这就是为什么您会发现在parallel's Changelog (截至 2017 年 3 月 6 日),有些仍未修复)并将其附加到该命令行。

因此,例如,如果从内部调用bash

echo "foo'bar" | parallel echo foo

bash -cecho foo foo\'bar命令行并行调用如果从内部rc(或 with PARALLEL_SHELL=rc调用rc -cwith echo foo foo''''bar.

在你的:

parallel bash -c 'echo :\$1' '' {}

parallel 连接那些给出的参数:

bash -c echo :$1  {}

而随着{}在你打电话的外壳正确的格式扩展,并引述parallel来自传递,要<that-shell> -c其将调用bash -c echo:$1$0,并在目前的争论$1

这不是如何parallel运作的。在这里,您可能想要:

printf '1\n2\n' | PARALLEL_SHELL=bash parallel 'echo :{}'

要查看有什么parallel作用,您可以在strace -fe execve(或者如果不是 Linux 的情况下在您的系统上运行它)。

在这里,您可以使用 GNUxargs而不是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通常不能用于任意数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Tomcat为什么可以与端口8080一起使用但不能与80一起使用?

为什么“ COALESCE”不能与“ GROUP BY”一起使用?

为什么<c:forEach>在JSP Spring中不能与Ajax请求一起使用?

为什么C#三元运算符不能与委托一起使用?

为什么在bash 3.2中source命令不能与进程替换一起使用?

rand为什么不能与AbstractFloat一起使用?

GET请求可与Postman一起使用,但为什么不能与ReactJS fetch一起使用?

为什么bash的行注释技巧不能与感叹号“!”一起使用?

为什么使用函数声明不能与Web Worker一起使用?

OpenCV-为什么光流不能与出队<Mat>一起使用?

为什么C#Rx Subscribe()函数不能与“ async”关键字一起使用?

为什么多个列表索引可以与__getitem__一起使用,而不能与__setitem__一起使用?

为什么@forward命名前缀不能与使用Sass的变量一起使用?

LibreOffice为什么不能与HUD一起使用?

Scala Puzzler:为什么head不能与toSet一起使用,而与Set一起使用呢?

为什么childElementCount不能与jQuery一起使用?

为什么javascript“ this”不能与“ each”一起使用?

为什么此脚本在Kali上只能与bash一起使用,而在Xubuntu上不能与bash一起使用?

setuid为什么不能与mount一起使用?

为什么Quickbooks可以与Ubuntu一起使用,而不能与Fedora一起使用?

为什么KeyDown事件不能与datagridview c#一起使用?

为什么以太网不能与AUKEY USB C集线器一起工作?

为什么此脚本不能与nohup一起使用,但是不能,不能呢?

为什么JQuery不能与CryptoJS一起使用?

C ++ 17,为什么自动非类型模板参数不能与SFINAE一起使用

为什么它可以与$ scope一起使用,但不能与`this`一起使用?

为什么 grep 不能与 iostat 一起使用?

为什么 foreach 不能与 String 一起使用?

为什么 CUDA 不能与 easyocr 一起使用?