1

我试图让这个功能,使其易于并行我的bash脚本工作。这个想法很简单,我并不是按顺序运行每个命令,而是将我想运行的命令传递给此函数,并在读取行时执行;为我运行bg中的工作并照顾物流....但它不起作用。我通过执行哪些东西添加了-x集,看起来像我想要执行的东西得到奇怪的引号......我该怎么办?bash - 错误尝试管道命令来运行分开的功能

runParallel() { 
    while read line 
    do 
     while [ "`jobs | wc -l`" -eq 8 ] 
     do 
      sleep 2 
     done 

     { 
      set -x 
      ${line} 
      set +x 
     } & 
    done 

    while [ "`jobs | wc -l`" -gt 0 ] 
    do 
     sleep 1 
     jobs >/dev/null 2>/dev/null 
     echo sleeping 
    done 
} 

for H in `ypcat hosts | grep fmez | grep -v mgmt | cut -d\ -f2 | sort -u` 
do 
    echo 'ping -q -c3 $H 2>/dev/null 1>/dev/null && echo $H - UP || echo $H - DOWN' 
done | runParallel 

当我运行它,我得到的输出类似如下:

> ./myscript.sh 
+ ping -q -c3 '$H' '2>/dev/null' '1>/dev/null' '&&' echo '$H' - UP '||' echo '$H' - DOWN 
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline] 
      [-p pattern] [-s packetsize] [-t ttl] [-I interface or address] 
      [-M mtu discovery hint] [-S sndbuf] 
      [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination 
+ set +x 
sleeping 
> 
+0

让make做到这一步怎么了? –

回答

1

set -x输出的报价是没有问题的,顶多是问题的另一个结果。主要问题是${line}eval ${line}不一样。

当一个变量被展开时,结果词不被视为shell保留结构。这是预期的,这意味着例如。

A="some text containing > ; && and other weird stuff" 
echo $A 

不关注无效语法,但打印变量值。

但在你的函数这意味着所有在${line},包括2>/dev/null之类的话,作为参数来ping,这set -x输出很好地显示,所以平抱怨过。

如果你想从变量复杂的命令行执行重定向和条件,你将不得不使用eval

+0

太棒了。在回应的文本周围加双引号,并使用eval使其工作。谢谢! – a8ksh4

1

如果我正确认识这一点,你可能不希望在你的echo命令单引号。单引号是文字字符串,不会解释你的bash变量$ H。

1

与许多GNU Parallel用户一样,您似乎已经编写了自己的并行程序。

如果你有GNU并行http://www.gnu.org/software/parallel/安装,你可以这样做:

cat hosts | parallel -j8 'ping -q -c3 {} 2>/dev/null 1>/dev/null && echo {} - UP || echo {} - DOWN' 

你可以安装GNU并行只需:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

手表GNU并行的介绍视频,了解更多: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1