这里有一个相对简单的问题。我需要在bash的后台运行一个函数。通常我会这样做:
FUNCTION &
但事情有点复杂。我有以下行来运行文本数据库中每个记录的main函数。我无法真正编辑这些代码而不会大幅改变整个项目的其余部分,但我仍然对新想法持开放态度。
cat databases/$WAN | grep -v \# | while read LINE; do MAIN; done
我想在后台为每个记录生成一个新终端,以进行一种并行类型处理,使事情变得更快。主要需要一分钟来处理每条记录。然而,这不起作用。
cat databases/$WAN | grep -v \# | while read LINE; do MAIN &; done
有什么建议吗?
*更新*
感谢所有回复。让我看看我是否可以回答其中的一些问题。
gniourf_gniourf - 是的我知道用这样的猫是错的。这是早期和关键代码,所以我还没有更新它。我现在读到了我做的大多数事情的while循环。我最终会解决它。你可能对语法很正确。当我这样分解时,事情似乎现在起作用了:
cat databases/$WAN | grep -v \# | while read LINE
do
MAIN & > /dev/null 2>&1
done
这样可以解决背景问题。我想知道在我的单行语法中搞砸了什么。感谢
chepner - 我不相信LINE是一个变量。我可能错了。关于Bash的一些事情仍然让我困惑。也许它是并且是一个变量,来自数据库的整个记录在处理之前被存储起来。
Bruce K - Waiting正是我想要避免的。如果我让它一次在同一个终端中运行,它将按顺序缓慢处理每个记录。如果我将每个记录推送到一个单独的终端进行处理,所有记录将同时处理(至少在我们看来)。额外的开销是有意的,以加快数据库循环的速度。
基数 - 是的,你是对的。我会读到这个。感谢您的链接。
答案 0 :(得分:1)
这对我有用:
$ 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变量,您可以尝试:
&#34;出口&#34; 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