Bash'de gecikmeli askıya alınmanın (Ctrl-Y) amacı nedir?


30

Uygulanabilir olan Bash man sayfasının tamamı sadece şöyle diyor:

Bash'nin çalıştığı işletim sistemi iş kontrolünü destekliyorsa, bash bunu kullanmak için olanaklar içerir. Bir işlem çalışırken askıya alma karakterini (tipik olarak ^ Z, Control-Z) yazmak, bu işlemin durdurulmasına neden olur ve kontrolü bash değerine döndürür. Gecikmeli askıya alma karakterinin (tipik olarak ^ Y, Control-Y) yazılması, terminalden girdi okumaya çalıştığında işlemin durmasına ve kontrolün bash'a döndürülmesine neden olur. Kullanıcı daha sonra bg arka planda devam etmek için komutu kullanarak bu işin durumunu değiştirebilir .fgön planda devam ettirme komutu veya onu öldürmek için kill komutu. A ^ Z derhal yürürlüğe girer ve bekleyen çıktının ve typeahead'in atılmasına neden olmak için ek bir yan etkiye sahiptir.

Hiç kullanmadım Ctrl- Y; Sadece yeni öğrendim. Ben sadece Ctrl- Z(askıya alma) ile iyi yaptım .

Bu seçenek hayal etmeye çalışıyorum için . Ne zaman faydalı olurdu?

(Bu özelliğin tüm Unix çeşitlerinde bulunmadığını unutmayın. Solaris ve FreeBSD'de bulunur, ancak Linux'ta yoktur. İlgili ayar stty dsusp.)

Belki daha az subjektif: ile gerçekleştirilebilir orada birşey var mı Ctrl- Yile aynı kolaylıkla başarılı olamaz Ctrl- Z?


@Gilles, FreeBSD'nin sahip olmasına rağmen stty dsusp, ^ Y (Solaris'te yaptım) üzerine bir SIGTSTP göndermeyi başaramadım. Senin varmi?
Stéphane Chazelas

Yanıtlar:


23

Csh için 4BSD kılavuzundan :

A ^Zderhal yürürlüğe girer ve beklemede olan çıktının ve okunmamış girişin yazıldığında atılmasının kesilmesi gibidir. ^YBir program okumaya çalışmadan (2) STOP sinyali üretmeyen başka bir özel anahtar vardır . Bu, okuduktan sonra durdurmak istediğiniz bir iş için bazı komutlar hazırladığınızda, yararlı bir şekilde önceden yazılabilir.

Bu nedenle amaç, birincisi işlenirken çoklu girdiler yazmak ve iş bittikten sonra işi durdurmaktır.


Bu açıklama, bash el kitabından tamamen farklıdır. "Bir program girişimleri okumak için gelene kadar ... Bir DUR sinyali oluşturmaz onu. " O stream girişteki her şey gibi sesler kadar^Y başarıyla okunacak ve ardından zaman ^Yisabet işlem durdurulur. Bunu doğru mu okuyorum?
Joker

Mac OS X üzerinde benim testinde @Wildcard, süreci) (okuma öncesi getiri durdurulur (ancak çağrıdan sonra okumak için () olduğunu olurdu Y çalışır döndü) ve devam ettirildikten sonra o ^ Y önce giriş almaktadır . Bence bunun kullanılması amaçlanmıştı, ancak bir satırın başında kullanılacaktı, bu durumda bu davranış önemli değildi. Gerçek kodda, ^ Y'nin kullanıcı işlemi okuma arabelleğine kopyalandığında askıya alındığından şüpheleniyorum.
Random832


Ancak, işlem devam ettiğinde, çağrı başarılı olacaktır ^Yve işlemi durdurduysanız ve işlem devam etmeden önce terminalinizi kapatsanız bile terminalinize yazdığınız verileri içerecektir . Sağ? ( "... devam ettirildikten sonra, ^ Y'den önceki bir girdi alır." Demek istediğim; genellikle C koduyla ilgilenmiyorum.) :)
Wildcard

Evet. Ve sonunda, kanonik modda okumak için alışılmadık olan (bazı metinler yazıp, sonra bir kez ^ D'ye basıldığında olduğu gibi) alışılmadık olan, yeni bir satır olmadan döner. gerçekten bir satırın başında yazılmış olması amaçlanmıştır.
Random832

11

Diyelim ki okuma girişi ve çalıştırma bir döngü. Görevin hesapladığı mevcut talimatı bitirmesine izin vermek yararlı olabilir, yeni bir komut satırına geri dönmeden kesmeden. Böylece bir döngüsü sona erdirmek için. Bu, döngüyü zarafetle sonlandırır ve readzaman aşımı kısıtlaması altındaysa tekrar çalışmasını önler .


Terminal oldu Neyse girdiyi okumak için denemek için gidiyor Ama eğer olacaktır durdurmak o noktada (ve giriş için bekleyin) ve olabildiğince ^Zbunu daha sonra .
Wildcard,

Evet. Güncellemeye bakınız.
Tomasz

Bir tane daha kontrol et. @Wildcard
Tomasz

1
Ama eğer bir zaman aşımı varsa, özel bir şey yapmazsanız, aynı zamanda zarafetle bitmeyecek mi?
Daniel Wagner

1
Olabilir. Ama aynı zamanda devam edip bazı varsayılan işler yapabilir.
Tomasz

4

Yararlı olabileceği bir senaryo düşünebilirim, ancak bu kesin bir durumdan bahsetti.

Bir temizleme yordamının parçası olarak silinmeden önce analiz etmek istediğiniz geçici dosyaları yazan bir komut dosyasında hata ayıkladığınızı varsayalım.

read fooDosyalar yazıldıktan sonra (ancak temizlemeden önce) bir yere ekleyebilir , komut dosyasını çalıştırabilir ve Ctrl- Yoluşturulurken - düğmesine basabilirsiniz . Daha sonra yapmanız gerekenleri yapmak için arka planda komut dosyası askıya alınmış ve daha sonra fgkomut dosyasının tamamlanmasına izin vermek için komut istemine bırakılırsınız .


1
Muhtemelen, çünkü komut dosyası zaten girdi için bekleyecek. Böylece sizden giriş yapmanızı isteyip istemediğinizi ve onu askıya almanızı kolayca izleyebiliyordunuz ^Z. Başka bir deyişle: Eğer yazdıktan sonra fgsize komut dosyası bazı giriş vermek zorunda kalacak zaten o devam edecek önce. Dolayısıyla benim sorum; Ben hala amacını görmüyorum ^Y. (Yanıtladığınız için teşekkürler!) :)
Wildcard

2

Aklıma gelen tek senaryo (ve hatta çok ikna edici bulmuyorum), bir kabuk komutu için ileride bir tür kullanmak istiyorsanız. Gelecekte bir süre girdi okuyacak bir komutun çalıştığını söyleyin. Sonra onu ^ Y yapabilirsiniz ve hemen çalışan komut askıya alındığında çalıştırmak istediğiniz bir sonraki kabuk komutunu yazın. BSD Unix'i kullanmaktan on yıllardır bunu gerçekten kullandığımı sanmıyorum.

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.