Начисление 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 представителей добавить асинхронные и ps1 теги?

РЕДАКТИРОВАТЬ:

Я добавил эту строку в мой .bashrc как простой тест, он, похоже, работал, поэтому, переписав их (я вернул предыдущую попытку), это было хорошо 🙂

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

Я положу это в функцию и проверю, запущено ли задание до его вызова. Извините за это, ведь мне кажется, что мне нужно было написать об этом. 🙂

re: ваше решение цикла каждую секунду: вы можете записать файл в / tmp, а не в свой домашний каталог. И PS1=$(customW)$(< ~/.ps1)\$ ' сохранит fork / exec cat .

re: исходный вопрос: как получить асинхронное обновление для PS1 : запустить асинхронную запись в PS1 :

  • установите PROMPT_COMMAND на функцию, которая проверяет, доступны ли данные.
    • Если это так, обновите PS1 и PROMPT_COMMAND
    • Если нет, оставьте PS1 со старым или заполнительным значением.

Используйте файл в /tmp для асинхронного ввода-вывода для записи и PROMPT_COMMAND для чтения.

Я думаю, что это должно сработать.