2016-04-24 20 views
5

Stdin'den bir satır okuyan ve satırın içeriğine göre bazı işlemler gerçekleştiren bir komut dosyası var. Ctrl-t yazarak basitçe çağrılabilmem için bu betiğe bir anahtar bağlamalıyım. Komut dosyasını ismiyle çağırdığımda beklendiği gibi çalışır, ancak anahtar bağladığımda kilitlenir. Aslında kabuk kilitleniyor ve onu öldürmek zorundayım. Komut dosyası read -r line kullanır. Aynı sonuçları ile cat denedim.Stdin'i okuyan bir komutu bağlama

Senaryo bu (dosya adı read.sh) benziyor: Böyle

#!/bin/bash 

echo -n ' > ' 
read -r buf 
echo "you typed $buf" 

Bind: Eğer Ctrl + t karşı bastığınızda

bind -x '"\C-t" : "read.sh"' 
+0

Tam olarak ne denediğinizi yayınlayabilir misiniz? – andlrc

cevap

2

Terminal ayarları farklıysa Komutu terminalden yeni başlattığınız zaman.

echo Terminal settings: "$(stty -a)" 

Şimdi kendisi tarafından komut dosyasını çalıştırın ve sonra Ctrl + t basarak çalıştırın: Eğer read.sh aşağıdaki satırı eklerseniz, terminal ayarlarınızı basalım. Bir kaç farklılığı fark edeceksiniz, bunların en büyükleri, -echo ve -icrnl eklemeleridir ve ekoyu kapatır ve yeni satır kullanımını değiştirir. Bu, betiğin asılı görünümünü verir.

Bu sorunu, tty'yi tekrar kanonik moda zorlayarak ve ekoyu yeniden ekleyerek komut dosyasının içine alabilirsiniz. Stty değişiklikleri yapmadan önce, ayarları kaydetmek ve komut dosyası çıktığında geri yüklemek isteyeceksiniz. Bunun için trap'u kullanabilirsiniz.

#!/bin/bash 
# Save the tty settings and restore them on exit. 
SAVED_TERM_SETTINGS="$(stty -g)" 
trap "stty \"${SAVED_TERM_SETTINGS}\"" EXIT 

# Force the tty (back) into canonical line-reading mode. 
stty cooked echo 

# Read lines and do stuff. 
echo -n ' > ' 
read -r buf 
echo "you typed $buf" 
+0

Mükemmel cevap. Teşekkürler! –