我正在使用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是做什么以及如何使用它。感谢您提供的任何帮助。
答案 0 :(得分: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
,因为您的输入只是一系列数字,每行一个。
答案 1 :(得分:1)
传递参数的问题与xarg对空白区域的解释有关。来自xargs手册页:
-0 Change xargs to expect NUL (``\0'') characters as separators, instead of spaces and newlines.
使用export
使变量可用于子进程可以解决环境变量的问题:
say.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
答案 2 :(得分:1)
我认为您有权限问题,请尝试获取该文件的执行权限“parallel.sh”
命令对我来说很好:
Kaizen ~/so_test $ printf "%s\n" {0..4} | xargs -0 -P 8 -n 1 echo
0
1
2
3
4
人找到了:
-print0
真;在标准输出上打印完整的文件名,然后是a null字符(而不是-print使用的换行符)。 这允许处理查找的程序正确解释包含换行符或其他类型的空格的文件名 输出。此选项对应于xargs的-0选项。
用于print0使用:检查链接:堆栈溢出中有一个问题
答案 3 :(得分:0)
为了避免空间问题,我使用新行字符作为带有-d选项的xargs的分隔符:
xargs -d '\n' ...