1

我在使用 OSX 的 Mac 上工作,我使用 bash 作为我的 shell。我有一个脚本可以达到以下效果:

VAR1="pass me into parallel please!"
VAR2="oh me too, and there's actually a lot of us, but its best we stay here too"
printf "%s\n" {0..249} | xargs -0 -P 8 -n 1 . ./parallel.sh

我得到错误:xargs: .: Permission denied。目的是并行运行另一个脚本(称为parallel.sh),该脚本输入数字0-249。此外,我想确保并行可以看到我们 VAR1 和 VAR2。但是当我尝试获取与 并行的脚本时. ./parallel,xargs 不喜欢这样。采购的重点是因为脚本具有我希望并行访问的其他变量。

我已经阅读了一些关于使用 print0 的内容,因为 xargs 用空格分隔它的输入,但我真的不明白 -print0 的作用以及如何使用它。感谢你们提供的任何帮助。

4

4 回答 4

2

如果您希望多个进程运行脚本,那么它们不能成为父进程的一部分,因此它们不能访问完全相同的变量。但是,如果您导出变量,则每个进程都可以获得它们的副本:

export VAR1="pass me into parallel please!"
export VAR2="oh me too, and there's actually a lot of us, but its best we stay here too"
printf "%s\n" {0..249} | xargs -P 8 -n 1 ./parallel.sh

现在你可以去掉多余的点,因为你没有获取parallel.sh 脚本,你只是在运行它。

也没有必要使用-0,因为您的输入只是一系列数字,每行一个。

于 2013-06-06T02:51:02.577 回答
1

传递参数的问题与 xarg 对空白的解释有关。从 xargs 手册页:

-0      Change xargs to expect NUL (``\0'') characters as separators, instead of spaces and newlines.

环境变量的问题可以通过export使变量可用于子进程来解决:

说.sh

echo "$1 $V"

结果

bash$ export V=whatevs
bash$ printf "%s\n" {0..3} | xargs -P 8 -n 1 ./say.sh
1 whatevs
2 whatevs
0 whatevs
3 whatevs
于 2013-06-06T02:28:42.847 回答
1

我认为您有权限问题,请尝试获取该文件“parallel.sh”的执行权限

命令对我来说很好:

Kaizen ~/so_test $ printf "%s\n" {0..4} | xargs -0 -P 8 -n 1 echo
0
1
2
3
4

男人发现:

-打印0

真的; 在标准输出上打印完整的文件名,后跟一个空字符(而不是 -print 使用的换行符)。这允许处理查找输出的程序正确解释包含换行符或其他类型空格的文件名。此选项对应于 xargs 的 -0 选项。

对于 print0 使用:检查链接:堆栈溢出中有一个问题

捕获 find 的输出。-print0 到 bash 数组中

于 2013-06-06T02:49:29.810 回答
1

为了避免空格问题,我将使用换行符作为带有 -d 选项的 xargs 的分隔符:

xargs -d '\n' ...
于 2016-08-03T11:48:28.750 回答