我非常喜欢快速计算的自定义PS1变量。因此,我在我的Bash-脚本中有一行,通过
PROMPT_COMMAND='PS1="$(/home/username/.config/bash/ps1 ${PWD})"'在这里,ps1是我自己在当前工作目录PWD下获取PS1的可执行文件。
在这个设置中点击enter,会出现一个没有提示的新行(我主要注意到这一点,因为光标位于行的开头)。这在常规的sh中很少发生。
让我们假设我总是站在同一个目录中,简单地按住enter,这样相同的进程就会被一次又一次地运行。然后,我仍然看到光标在行的开头。然而,hyperfine说
~/.c/bash $ hyperfine -N --warmup=1000 "/home/username/.config/bash/ps1 $PWD"
Benchmark 1: /home/username/.config/bash/ps1 /home/username/.config/bash
Time (mean ± σ): 0.5 ms ± 0.1 ms [User: 0.4 ms, System: 0.0 ms]
Range (min … max): 0.4 ms … 2.1 ms 5335 runs因此,在60 Hz的计算机屏幕上(即每帧之间~16 ms ),提示符几乎是瞬间产生的,而空行很少被绘制。
为什么即使可执行文件非常快,也会发生这种情况?从结果中可以看出,可执行文件是非常优化的,但是它确实包含了一些fopen和一两个fread和fclose,以及一个printf。
我能更快地生成/打印PS1吗?如果可以,怎么做?
发布于 2023-04-02 18:01:43
我确实解决了这个问题。我下载了Bash的源代码,并将/home/username/.config/bash/ps1的源代码合并到Bash源代码中。关键是改变static void execute_prompt_command()在eval.c中的函数。您可能需要学习Bash的一些内部特性,但是我在下载源代码后15分钟就完成了。例如,我不得不通过pwd = get_string_value("PWD")获得PWD,而不是从argv获得它。它按照预期工作,并且燃烧得很快!
https://unix.stackexchange.com/questions/725003
复制相似问题