linux - Bash 在后台运行函数

标签 linux bash function background

这里有一个相对简单的问题。我需要在 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/

相关文章:

javascript - 无返回值的函数

java - 无法使用 docsplit 转换 openoffice 文档导致 java.lang.NoClassDefFoundError

php - 如何将颜色从 bash 脚本传播到 CI(GitHub Actions、Travis、Gitlab...)?

c++ - 如何让我的管道命令接受选项?

json - 如何从可执行 bash 脚本中的 curl 获得正确响应?

bash - 如何获取用空格分隔的字符串的第一个元素

php - 如何在PHP中动态创建字符串?

javascript - 使用循环分配函数参数

c - 为什么从 sockaddr_in 到 sockaddr 的转换有效

regex - 远程日志记录条目的 Grep 系统日志配置