![异步运行 .bashrc 的部分内容](https://linux22.com/image/1262546/%E5%BC%82%E6%AD%A5%E8%BF%90%E8%A1%8C%20.bashrc%20%E7%9A%84%E9%83%A8%E5%88%86%E5%86%85%E5%AE%B9.png)
我有一些导出和其他需要运行另一个程序的东西(获取路径或其他东西),它们需要花费相当多的时间来运行,这意味着我的 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
变量。ans
42
当然,启动 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 的环境。
启动文件中不应该有任何长时间运行的进程。