异步填充 PS1

异步填充 PS1

我有一些与 git svn 相关的函数,看看我是否必须从存储库中拉取/推送到存储库。

我的问题是我编写的用于收集此信息的函数太慢。我想让它们异步,以便PS1显示默认值,但如果函数生成的数据已准备好,我希望将其打印出来。

我希望在我的提示中包含这些信息 - 例如,这样我就知道是否必须拉动 - 而无需git svn fetch每次都进行操作。

如果我必须推送更改,我会调用此函数向我的 PS1 添加 ↑。

function hasToPush {
    (($1 == 0)) && 
        (git svn dcommit --dry-run 2>/dev/null | grep -q "diff-tree" && echo "↑")
}

如果我必须拉动,我会调用这些函数来添加 ↓。第一个用于每 2 分钟刷新一次索引,以便我可以进行检查(($latest > $current))

function loopingGitSvnFetch {
     sleep 120
     git svn fetch &>/dev/null
}
loopingGitSvnFetch &
function hasToPull {
    (($1 == 0)) && (
        latest=$(git svn log | awk 'NR==2' | cut -d ' ' -f1 | tr -d 'r')
        current=$2
        (($latest > $current)) && echo "↓"
    )
}

为了使它们异步,我尝试将它们组合在一起,如下所示:

function async {
    {
     git diff-index --quiet --cached HEAD &>/dev/null
     dirty=$(echo $?)
     push=$(hasToPush $dirty)
     gitsvn=$(git svn info 2> /dev/null | grep Revision)
     gitsvn=${gitsvn#Revision: }
     pull=$(hastoPull $dirty $gitsvn)
     callback $push $pull
     } &
 }

但这会产生同样缓慢的行为。我尝试将结果放入文件中,然后读取它,但我不喜欢这种方法。

我考虑过使用PROMPT_COMMAND.但这不会是异步的;这将是按需的。

您能否阐明PS1我的行为方式或我做错了什么?先感谢您。

PS:有 300 名代表的人可以添加 async 和 ps1 标签吗?

编辑:

我将这些行添加到我的 .bashrc 作为一个简单的测试,它似乎有效,所以重写它们(我恢复了之前的尝试)似乎是一件好事:)

while true;
do
    discoverScmInfo &>~/.ps1
    sleep 1
done &
PS1='$(customW)$(cat ~/.ps1)\$ '

我将把它放在一个函数中,并在调用它之前检查作业是否已经在运行。对此感到抱歉,毕竟看来我所需要的只是写下来。 :)

答案1

回复:每秒循环的解决方案:您可以写入 /tmp 中的文件,而不是写入主目录中。并且PS1=$(customW)$(< ~/.ps1)\$ '会保存cat.

回复:原来的问题:如何获取异步更新PS1:要启动异步写入PS1

  • 设置PROMPT_COMMAND为检查数据是否可用的函数。
    • 如果是,则更新PS1并取消设置PROMPT_COMMAND
    • 如果不是,则保留PS1旧值或占位符值。

使用文件/tmp进行异步 IO 写入和PROMPT_COMMAND读取。

我认为这应该有效。

相关内容