Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Shell脚本:使用xargs执行Shell函数的并行实例_Bash_Shell_Xargs - Fatal编程技术网

Bash Shell脚本:使用xargs执行Shell函数的并行实例

Bash Shell脚本:使用xargs执行Shell函数的并行实例,bash,shell,xargs,Bash,Shell,Xargs,我试图在shell脚本中使用xargs来运行在同一脚本中定义的函数的并行实例。该函数乘以页面的获取次数,因此在并行进程中而不是在后台进程中同时获取页面非常重要(如果我对这一点的理解是错误的,并且两者之间的差异可以忽略不计,请告诉我) 功能是: function time_a_url () { oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut

我试图在shell脚本中使用xargs来运行在同一脚本中定义的函数的并行实例。该函数乘以页面的获取次数,因此在并行进程中而不是在后台进程中同时获取页面非常重要(如果我对这一点的理解是错误的,并且两者之间的差异可以忽略不计,请告诉我)

功能是:

function time_a_url ()
{
     oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut -d" " -f2)
     echo "Fetching $1 took $oneurltime seconds."
}

如何使用xargs管道来实现这一点,该管道的形式可能需要多次并行运行time\u a\u url作为参数?是的,我知道GNU parallel,我只是没有特权在我写这篇文章的地方安装软件。

如果你在另一个系统上安装GNU parallel,你会看到功能在一个文件中(称为parallel)


您应该能够简单地将该文件复制到您自己的~/bin。

下面是一个演示,演示如何让您的函数工作:

$ f() { echo "[$@]"; }
$ export -f f
$ echo -e "b 1\nc 2\nd 3 4" | xargs -P 0 -n 1 -I{} bash -c f\ \{\}
[b 1]
[d 3 4]
[c 2]
这项工作的关键是导出函数,以便生成的
xargs
将看到它,并转义函数名和转义大括号之间的空格。你应该能够适应这种情况。您需要调整
-P
-n
的参数(或删除它们),以满足您的需要

您可能可以摆脱
grep
cut
。如果您使用的是Bash内置的
time
,则可以使用
TIMEFORMAT
变量指定输出格式。如果您使用的是GNU
/usr/bin/time
,则可以使用
--format
参数。这两个选项中的任何一个都允许您同时删除
-p

您可以用
-q
替换
wget
命令的这一部分:
2>&11>/dev/null
。在任何情况下,这些都是相反的。在Mac OS X上,正确的顺序应该是
/dev/null 2>&1

xargs:max.进程数必须大于0(对于:xargs-p[>0])


我使用了
xargs-P0-n1-I{}bash-c“f{}”
,它仍然有效,而且看起来有点整洁。
f() { echo "[$@]"; }
export -f f

echo -e "b 1\nc 2\nd 3 4" | sed 's/ /\\ /g' | xargs -P 10 -n 1 -I{} bash -c f\ \{\}

echo -e "b 1\nc 2\nd 3 4" | xargs -P 10 -I '{}' bash -c 'f "$@"' arg0 '{}'