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