异步运行 .bashrc 的部分内容

异步运行 .bashrc 的部分内容

我有一些导出和其他需要运行另一个程序的东西(获取路径或其他东西),它们需要花费相当多的时间来运行,这意味着我的 bash 启动时间大约为 5 秒。

在我离开并在我的中添加一些基本缓存之前.bashrc,有没有办法可以异步运行某些东西,以便让我在正在运行的 shell 中导出变量?

(所以,这实际上不仅限于.bashrc,而且一般也适用于 bash。)

答案1

很大程度上取决于这些程序何时运行以及您何时需要它们的结果。如果它们何时运行无关紧要(即它们的结果不会随时间而变化),那么最好让它们从您的~/.profile~/.bash_profile(即,当您登录时)而不是从您的运行~/.bashrc

如果您需要它们的结果,但又等不及它们运行的​​ 5 秒钟,那么您在 shell 启动后的前 5 秒钟内会做什么呢?您无法运行任何依赖于这些程序输出的命令,因为结果尚未可用。

我认为如果您更详细地描述具体的要求,我们也许能够给您更好的答案。

尽管如此,您可以按照 Dennis Williamson 的建议在后台启动程序,并让它们将结果写入主目录中的某些文件。然后,您可以设置 bash 变量PROMPT_COMMAND来获取这些文件,然后 bash 会在每次显示 之前执行此操作PS1

例如,假设您的后台程序在完成时写入export ans=42文件。在您的 中,输入~/answer~/.bashrc

PROMPT_COMMAND=". ~/answer"

然后,每次 shell 显示 时PS1,它将首先 source并且您的环境最终(例如,启动后 5 秒)将包含值为 的~/answer变量。ans42

当然,启动 shell 后的前 5 秒~/answer将包含来自最后的启动 shell 的时间,因此您必须决定这是否重要(以及如何在必要时重置该文件)。

答案2

您可能需要考虑平衡配置文件(执行一次)和 bashrc 文件(每次启动(交互式)bash 时都会执行)之间的工作量。我将 bashrc 保持在最低限度 - 这样就可以快速启动。我的配置文件还不错 - 虽然很复杂,但肯定不会花 5 秒钟。

答案3

我不知道有什么方法可以在后台设置变量。但是,您可以在后台运行脚本,这样它们就可以并行运行,而不是按顺序运行,同时捕获它们的输出。这可以加快执行速度。您可以使用文件描述符 3-9 使用此方法,总共实现 7 个并行进程。

要明确的是,所有执行的命令必须在生成交互式 shell 之前完成,以便使用它们的输出来设置变量。

这个解决方案只是允许脚本的某些部分与脚本的其余部分并行运行(在本例中为.bashrc

function copget { read -u $1; echo "$REPLY"; }

coproc DATE { date; }
exec 3<&${DATE[0]}

coproc UNAME { uname; }
exec 4<&${UNAME[0]}

var1=$(copget 3)
exec 3>&-

var2=$(copget 4)
exec 4>&-

答案4

您可以使用“&”符号在后台运行进程。

some_program &

但是,该程序将无法直接影响启动它的 shell 的环境。

启动文件中不应该有任何长时间运行的进程。

相关内容