GNU/Linux >> Belajar Linux >  >> Linux

Isi Ps1 Secara Asynchronous?

Saya memiliki beberapa fungsi terkait git svn yang melihat apakah saya harus menarik/mendorong dari/ke repositori.

Masalah saya adalah bahwa fungsi yang saya tulis untuk mengumpulkan informasi ini terlalu lambat. Saya ingin membuatnya asinkron sehingga PS1 menunjukkan default, jika meskipun data yang dihasilkan oleh fungsi sudah siap, saya ingin itu dicetak.

Saya ingin memiliki informasi ini di Prompt saya – sehingga, misalnya, saya tahu jika saya harus menarik – tanpa melakukan git svn fetch setiap saat.

Ini adalah fungsi yang saya panggil untuk menambahkan ke PS1 saya jika saya harus mendorong perubahan saya.

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

Ini adalah fungsi yang saya panggil untuk menambahkan jika saya harus menarik. Yang pertama digunakan untuk me-refresh indeks saya setiap 2 menit sehingga saya dapat melakukan (($latest > $current)) periksa.

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 "↓"
    )
}

Untuk membuatnya tidak sinkron, saya mencoba menggabungkannya seperti ini:

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
     } &
 }

Tapi itu menghasilkan perilaku lambat yang sama.
Saya sudah mencoba memasukkan hasil ke dalam file dan kemudian membacanya, tapi saya tidak suka pendekatan itu.

Saya telah berpikir untuk menggunakan PROMPT_COMMAND . Tapi itu tidak akan async; itu akan sesuai permintaan.

Bisakah Anda menjelaskan bagaimana PS1 berperilaku atau apa yang saya lakukan salah?
Terima kasih sebelumnya.

PS:Bisakah seseorang dengan 300 perwakilan menambahkan tag async dan ps1?

EDIT:

Saya menambahkan baris ini ke .bashrc saya sebagai tes sederhana, sepertinya berhasil, jadi setelah menulis ulang (saya mengembalikan upaya saya sebelumnya) tampaknya adalah hal yang baik 🙂

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

Saya akan menempatkan ini dalam sebuah fungsi dan memeriksa apakah pekerjaan sudah berjalan sebelum memanggilnya.
Maaf tentang ini, lagipula sepertinya yang saya butuhkan hanyalah menulis tentangnya.

Terkait:Mengapa mengarahkan STDERR ke /dev/null dilakukan dengan cara ini?

Jawaban yang Diterima:

re:solusi loop Anda setiap detik:Anda dapat menulis ke file di /tmp, alih-alih di direktori home Anda. Dan PS1=$(customW)$(< ~/.ps1)\$ ' akan menyimpan fork/exec dari cat .

re:pertanyaan awal:bagaimana cara mendapatkan pembaruan async ke PS1 :
Untuk memulai async, tulis ke PS1 :

  • setel PROMPT_COMMAND ke fungsi yang memeriksa apakah data tersedia.
    • Jika ya, perbarui PS1 dan hapus PROMPT_COMMAND
    • Jika tidak, tinggalkan PS1 dengan nilai lama atau placeholder.

Gunakan file di /tmp untuk async IO untuk menulis, dan PROMPT_COMMAND untuk membaca dari.

Saya pikir ini harus berhasil.


Linux
  1. Memahami Dunia Digital:Ulasan buku saya yang jujur

  2. Kelola direktori home pengguna Linux dengan systemd-homed

  3. Letakkan catatan tempel di desktop KDE Linux Anda

  1. Bagaimana Linux menyelamatkan komputer yang lambat (dan planet ini)

  2. Memulai NetworkManager di Linux

  3. Bagaimana Cara Menghasilkan Prompt Ps1 Di Bash Atau Ksh93 Mirip Dengan Tcsh?

  1. Bash Menimpa Baris Pertama, Ps1 Bash Prompt?

  2. Isi Ps1 Secara Asynchronous?

  3. Mendorong prompt PS1 saya melalui ssh