Linux bash-尝试通过管道将命令运行到单独的函数时出错

Linux bash-尝试通过管道将命令运行到单独的函数时出错,linux,bash,parallel-processing,job-scheduling,variable-expansion,Linux,Bash,Parallel Processing,Job Scheduling,Variable Expansion,我试图获得这个函数,以使我的bash脚本能够轻松并行工作。想法很简单;我不按顺序运行每个命令,而是将要运行的命令通过管道传输到此函数,它在读取命令行时执行;帮我在后台处理工作,并负责后勤。。。。但它不起作用。我在执行东西的地方添加了set-x,看起来我想要执行的东西周围有奇怪的引号。。。我该怎么办 runParallel () { while read line do while [ "`jobs | wc -l`" -eq 8 ] do

我试图获得这个函数,以使我的bash脚本能够轻松并行工作。想法很简单;我不按顺序运行每个命令,而是将要运行的命令通过管道传输到此函数,它在读取命令行时执行;帮我在后台处理工作,并负责后勤。。。。但它不起作用。我在执行东西的地方添加了set-x,看起来我想要执行的东西周围有奇怪的引号。。。我该怎么办

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
> 

如果我理解正确,您可能不希望在echo命令中使用单引号。单引号是文字字符串,不能解释bash变量$H。

set-x输出中的引号不是问题所在,最多是问题的另一个结果。主要问题是
${line}
eval${line}
不同

展开变量时,生成的字不会被视为shell保留结构。这是预期的,它意味着

A="some text containing > ; && and other weird stuff"
echo $A
不显示无效语法,但打印变量值

但在您的函数中,这意味着
${line}
中的所有单词,包括
2>/dev/null
等,都作为参数传递给ping,ping的
set-x
输出很好地显示出来,因此ping抱怨


如果您想从带有重定向和条件的复杂命令行执行变量,那么您必须使用
eval

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

如果已安装GNU并行,则可以执行以下操作:

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 Parallel的介绍视频,了解更多信息:

让make来做有什么不对?太棒了。在回显的文本周围加上双引号,并使用eval使其正常工作。谢谢