Yeni bir komut istemi basmak ve mevcut satırı yeniden çizmek için bash alma komutu var mı?


1

Yavaş komutların bitmesini beklemek yerine, onları arka planda çalıştırmak istiyorum. Ancak, çalışmayı bitirip stdout'a yazdırdıklarında anlıyorum. imleci gösterir) bu:

$ slowcmd &
$ cmd_output
█
  • İmlecimden önce bilgi istemi dizesi yok.
  • ve slowcmd Herhangi bir yavaş komut olabilir (Denedim şeyler için, sadece dedim ki alias slowcmd='sleep 1 && echo cmd_output' )

Oysa şöyle bir şey istiyorum:

$ slowcmd && redrawPromptString &
$ cmd_output
$ █

Komutun çıktısından sonra benim için yeni bir Komut Dizisi yazdırılır.

Ne yapabilirim redrawPromptString Ne istiyorsam onu ​​yap? denedim clear, kill $$ göndermek için ^C terminale ve sonunda printf "^C" (elbette işe yaramadı). Ben bash koşuyorum. (GNU bash, sürüm 3.2.57).


İçin redrawPromptStringpeki ya printf '$ '?
dsstorefile1

PS1'im renkli ve ters eğik çizgiden kaçan özel karakterler kullanıyor \@ zaman için. (Ama evet, bu tam olarak istediğini elde etmeyi umursamayan herhangi bir aklı başında bir kişi için uygun bir çözümdür ...) Ahaha ama gerçek olarak, cehaletten istediğimi yapamamaktan nefret ediyorum! Kullandığım programdaki destek yetersizliği? Tabii (şimdilik). Ama cehalet dışında? Bundan hoşlanmadım. Ben google ve yığın taşması ve inekler eve gelinceye kadar şimdi düşündüğüm herkese soracağım.
Ari Sweedler

1
Neden ayrı, özel slowcmd terminal? Gibi terminal çoklayıcı kullanın tmux, yeni pencere oluştur ve orada çalıştır slowcmd tekrar çalışma terminaline geçip işinize devam edebilirsiniz.
Alex

@Alex iTerm'de yeni bir sekme de açabilirim. Biraz zaman alan komutları yaparken terminalimin kontrolünü nasıl alacağımı sormuyorum, çünkü bunu nasıl yapacağımı zaten biliyorum. Ve böyle bir soru sorsaydım haklı bir şekilde oy kullanmazdım. Hayır, buluşsal bir buluşma istemiyorum, bir çözüm arıyorum.
Ari Sweedler

Yanıtlar:


1

kullanım redraw-current-line fonksiyonu bind yerleşik. İlk önce belki bağlı olup olmadığını kontrol edin:

bind -q redraw-current-line

Bunu varsayılan olarak bağlı görmemiştim, bu nedenle muhtemelen bağlamanız gerekecektir. Bir tuş kombinasyonu seçin, diyelim Ctrl + Y . Daha önce alınmış olup olmadığını kontrol edin:

bind -p | grep -F '"\C-y'

Boş çıktı, kombinasyonun kullanılmadığı anlamına gelir. Eğer öyleyse, hadi bağlayalım redraw-current-line ona:

bind "\C-y":redraw-current-line

Şimdi, ne zaman bir arka plan işlemi komut satırınızla karıştırsa, tuşuna basın. Ctrl + Y . Ardından, isteminiz kısmen yazdığınız herhangi bir komutla (varsa) birlikte yeniden çizilecektir, böylece hiçbir şey olmamış gibi devam edebilirsiniz.

Bağlamayı kalıcı hale getirmek için yukarıdaki komutu ~/.bashrc, ama yapma. Doğru yaklaşım değiştirmektir ~/.inputrc (kullanıcı için) veya /etc/inputrc (geniş sistem). Bu şekilde kullanan herhangi bir program readline(3) kütüphane itaat edecek. Her iki dosyaya da eklenecek satır şöyle görünür:

"\C-y":redraw-current-line

Ama eğer yaratırsan ~/.inputrc yeniden, ilk satırının söylediğinden emin ol $include /etc/inputrc. Bunun nedeni bu noktaya kadar readline kullandı /etc/inputrc ve belki de iş akışınız bu dosyadakilere dayanmaktadır. Bundan böyle, kütüphane ~/.inputrc yerine; çizgi $include /etc/inputrc sistem genelinde dosyayı da ayrıştırır.

Daha fazla bilgi için help bind ve man 3 readline.


Kullanıyorum "\C-c"gönderen INTR character göre sttyve tüm girişlerin atılmasını ve komut dosyasının yeniden sunulmasını sağlar. Fakat redraw-current-line tam olarak aradığım şeydi! Geçerli girişimi VEYA ekran geçmişimi kaybetmiyor. Açgözlü olmak istemem ama bir çağırabilecek herhangi bir CLI komutunu biliyor musunuz? Readline işlev?
Ari Sweedler

İle ilgili ayrıntılı açıklama için +1 bindde. Bunun üzerine iyi belgeler bulmak çok süper zor. Man bash, Shell Builtin Commands'ın altında iyi şeyler içeriyor (eğer tüm hamliği bulabilirseniz). Bunu okuyan başkası için bağlantı sadece hakkında bindve çok daha fazla noob dostu buldum.
Ari Sweedler

1

Eğer basarsan Ctrl+Lkısmen istediğini yapar. İmleç konumu dahil o noktaya kadar yazdığınız her şeyi içeren geçerli satırı yeniden çizer, ancak ekranı temizler, böylece önceki çıktınız kaybolur (ya da kaydırma tamponunda bir terminal penceresi varsa). Öte yandan, denemeye istekliydin clear, belki de bu bir problem değildir.


Evet, clear ve ^L Ne istersem onu ​​yapma. Komut bitirme işleminin yeni bir bilgi istemi oluşturmasını istiyorum, bu nedenle el ile hiçbir şey yapmak zorunda değilim. Bir yolu olmalı! Kullanıyorum ^C veya ^L ya da sadece düz <Enter>, onların hepsi . Ama cehaletten daha düşük optimal bir şey yapıyorum ve bundan nefret ediyorum!
Ari Sweedler

1
Bilgi istemi zaten yazdırıldığından, yeni bilgi istemi almazsınız. Ama kullanabilirsiniz set -b böylece kabuk derhal `[1] + Tamam 'ı basacak ve imleciniz yeni bir çizgi üzerinde olacaktır. Ayrıca trap SIGCHLD ve yeni bir istemi yazdırmak için kullanın, ancak sona eren bir arka plan işlemi olup olmadığını öğrenmeniz gerekir.
RalfFriedl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.