我有一些与 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
读取。
我认为这应该有效。