这里有一个相对简单的问题。 我需要在bash中的后台运行一个函数。 通常我会这样做:
FUNCTION &
但事情比这更复杂一点。 我有以下一行文本数据库中的每个logging运行主要function。 我无法真正编辑这些代码,而没有大幅度改变整个项目的其余部分,但我仍然接受新的想法。
cat databases/$WAN | grep -v \# | while read LINE; do MAIN; done
我想在后台为每个logging产生一个新的terminal,做一个并行types的处理,使事情变得更快。 主要需要一分钟来处理每条logging。 但是这不起作用。
cat databases/$WAN | grep -v \# | while read LINE; do MAIN &; done
有什么build议么?
*更新*
感谢所有的答复。 让我看看我能否回答一些这些问题。
gniourf_gniourf – 是的,我知道使用这样的猫是错误的。 这是早期的,关键的代码,所以我还没有更新它。 我现在读了大部分事情的while循环。 我将最终修复它。 你可能是正确的语法。 当我这样分手时,事情似乎现在起作用了:
cat databases/$WAN | grep -v \# | while read LINE do MAIN & > /dev/null 2>&1 done
这样可以修复背景问题。 我不知道在我的单行语法中搞砸了什么。 谢谢
chepner – 我不相信LINE是一个variables。 我可能是错的。 关于Bash的一些事情仍然让我困惑。 也许这是一个variables,从数据库的整个logging被存储到处理之前。
布鲁斯K – 等待正是我想要避免的。 如果我让它一次运行在同一个terminal上,它将按顺序缓慢地处理每条logging。 如果我将每条logging都推送到一个单独的terminal进行处理,那么所有的logging都将被同时处理(至less在我们眼中)。 额外的开销是故意的,以加快通过数据库循环发生的速度。
基数 – 是的,你是对的。 我会读一读。 感谢您的链接。
这对我工作:
$ function testt(){ echo "lineee is <$lineee>";} $ grep 5432 /etc/services|while read lineee;do testt&done lineee is <postgres 5432/udp # POSTGRES> lineee is <postgres 5432/tcp # POSTGRES>
如果由于某种原因,您的MAIN函数没有看到LINE变量,您可以尝试:
事先“导出”LINE变量:
$ export LINE $ # do your thing
或者,将读取的行作为参数传递给该函数:
$ function testt(){ LINE="$1"; echo "LINE is <$LINE>";} $ grep 5432 /etc/services|while read LINE;do testt "$LINE"&done