İşlemin arka planda devam etmesini sağlamak için bir tuşa Ctrl-Z ve bg'yi nasıl yapabilirim?


25

Görevi askıya alma ve ardından Ctrl-Z bgdiziye çok sık devam etmesine izin verme şeklini takip ediyorum .

Merak ediyordum, bunu tek bir tuşa basmanın herhangi bir yolu var mı?

Benim kabuğum zsh


Bunun muhtemelen zor kodlanmış olduğunu söylemek istiyorum. Ama ben% 100 değilim
Chad Harrison

Elbette, ama zarif bir çözüm buldum, teşekkür ederim superuser.com/a/161922/35223
Evgeniy Dolzhenko

Yanıtlar:


24

Ctrl+ ZSekansı olmayan bir kabukla, terminal tarafından ele alınır. (Yararlı arkaplan: 'terminal', 'kabuk', 'tty' ve 'konsol' arasındaki tam fark nedir? )

Sadece küçük bir olmayan uzayabilir grubu fonksiyonları olabilir bir terminalde bir anahtara bağlı olan . Sen edebilirsiniz tuşları özelleştirmek bu fonksiyonların bağlı ancak başka işlevi ekleyin değil. Bu işlevler üç kategoriye ayrılır:

  • Kendilerini sağlamayan programlarda komut satırı sürümü (nadiren pratikte kullanacağınız pişmiş mod olarak da adlandırılır (kanonik mod, ayrıca pişmiş mod da denir ), satır sonu ( eof, Ctrl+ D), satır sonu ( eol, Ctrl+ M), silme karakteri (sol erase, Ctrl+ H), silme kelime (sol werase, Ctrl+ W), silme hattı ( kill, Ctrl+ U).
  • Manuel akış kontrolü: stop( Ctrl+ S), start( Ctrl+ Q). Yalnızca terminal bilgisayarla yetişemediğinde veya tersi durumda olduğunda karakterleri düşüren eski seri terminallerde kullanışlıdır.
  • Sinyalleşme: kesme ( intr, Ctrl+ C), zorla bırakma ( quit, Ctrl+ \), askıya alma ( Ctrl+ Z).

Linux da dahil olmak üzere bazı sistemler bu listeyi genişletiyor, ama ben arka plan içeren bir tane görmedim. Hem çekirdekteki terminal sürücüsünde hem de terminal emülatöründe destek alacağını unutmayın. Bu nedenle, ön plan işine bir SIGTSTP sinyali gönderen askıya alma işlemini yapmanız gerekir . Bu , genellikle kabuk olan ön plan işinin liderinin ana sürecinde bir SIGCHLD'i tetikler . Kabuk SIGCHLD'i aldığında, waitpidneden bildirildiğini anlamaya çağırır ve bir arka plan işinin askıya alındığını tespit etmesi üzerine bir bildirim (örn. [1] + 12345 suspended mycommand) Ve yeni bir bilgi istemi görüntüler.

Kabuğu SIGCONT, ön plandaki işe bir sinyal göndermesi için programlayabilirsiniz . Zsh'nin bunun için bir kancası olduğunu sanmıyorum, kaynak kodunu eklemelisin. Ve zsh'ın gerçekten programı kesmek isteyip istemediğinizi bilmemesi mümkün değildir (hata, bu program yanlış bir şey yapıyor olabilir, ben hallederken askıya almama izin verin) ya da arka plana ayırmak.


Yapmam gereken, Ctrl+ Zsh sırasını geçerli işi arka planlamak için zsh olarak ayarlamaktır ( %%). Bu şekilde, Ctrl+ Z Ctrl+ tuşlarına basarak ön plan işini arka plana gönderebilirim Z. Bunda olduğum sürece, ben yapmak Ctrl+ Zakım giriş hattı boş değilken (Ben sadece bir alt işlemi geri dönmediler böylece) başka yararlı bir şeyler yapmak: bana başka komutu yazın sağlayan mevcut giriş hattını “askıya” Bundan sonra kesilen çizgi tekrar giriş arabelleğine itilir.

fancy-ctrl-z () {
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

Gilles, bu alacağımı bekleyemediğim inanılmaz derecede eksiksiz, eğitici ve düşünceli bir cevap! Çok teşekkür ederim!
Evgeniy Dolzhenko

2

^ z ^ z yukarıdaki zsh gibi bash'ta mümkündür, yine de biraz garip ve bunu uzun süredir çalıştırmadım:

  • .İnputrc'nizde haritalama "\C-z": "bg\n"
  • PS0 bash değişkeninde `$ (stty susp ^ z) 'ifadesi bulunur
  • PROMPT_COMMAND bash değişkeninde 'stty susp ^ @' ifadesini ekleyin

yani bir komut çalıştırıldığında askıya alma için ^ z açılır, ardından bash istemi için kapatılır.


1

Yani çözümü buldum, tam olarak istediğimi değil ama buradan lanet olası /superuser//a/161922/35223

Boş bir komut satırında bg komutunu çalıştırır (böylece Ctrl + Z Ctrl + Z bir programı askıya alır ve hemen arka planda devam eder).


Bunun zsh gerektirdiğini not edeceğim; bash'ta desteklenmiyor. (kutunun dışında, yine de)
Kevin M

@KevinM Bash'da analog bir fonksiyon yazabilirsiniz (en azından temel sürüm Ctrl+Zarama çağrısı bg, boş olmayan bir giriş hattının tespit edildiğinden emin değilim).
Gilles 'SO- kötülük olmayı bırak'

0

Başlangıçta ön planda çalıştırmak ve sonra arkaplana geçmek istediğiniz komutlar mı? Bunu yapmanın daha basit bir yolu olup olmadığını bilmiyorum. Ancak, başlangıçta arka planda olacak komutları çalıştırmak isterseniz, satırın sonuna sadece bir işaret ve işareti ekleyebilirsiniz. örneğin, ping google.com &arka planda pinglemeye başlayacaktır; sen yazmazsan, onunla etkileşime giremezsin fg.


1
Teşekkürler, sorun şu ki, bazen komutu çalıştırmanın ne kadar zaman alacağı konusunda bir fikriniz olmaz, bu nedenle etkileşimli olarak çalışırsınız ve daha sonra arka planda devam etmesine izin vermenizin daha iyi olduğunu fark edersiniz. Kabul edilen cevap, günlük olarak benim için harikalar yaratıyor!
Evgeniy Dolzhenko

Cevabınız için teşekkürler. Kabul edilen cevap oldukça temiz!
sekizinci
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.