2012-10-24 16 views
6

Bazı komut dosyası kavramlarını öğrenmek için bir bash sarmalayıcı yazıyorum. Bu fikir, bash'ta bir komut dosyası yazmak ve girişte bir kullanıcı kabuğu olarak ayarlamaktır. SIGINT, bash betiğinde okumayı iptal etmek için mi?

Bir süre döngü olduğunu read s- ve eval s kullanıcının giriş yaptı, sonra, senaryo böylece kullanıcı oturum biter iptal kullanıcı CTRL + C yazdığınız zaman, fark ettim.

Bunu önlemek için

, ben tuzağa hiçbir şey yapmadan, SIGINT tuzağa düşürdü.

Şimdi, sorun, komutun yarısında CTRL + C yazdığınızda, bir bash'ın yaptığı gibi iptal edilemez - sadece CTRL + C öğeyi yok sayar.

ping stockoverf^Cping stackoverflow.com yazdığımda, istediğim ping stackoverflow.com yerine ping stockoverfping stackoverflow.com alırım.

Bunu yapmanın bir yolu var mı?

#!/bin/bash 

# let's trap SIGINT (CTRL + C) 
trap "" SIGINT 

while true 
do 
    read -e -p "$USER - SHIELD: `pwd`> " command 
    history -s $command 
    eval $command 
done 
Ctrl-A göndermek için xdotool gibi bir araç kullanabilirsiniz

cevap

3

(başlayacak-of-line) Ctrl-K (silme uca-of-line) Dönüş (temizlemek için çizgi)

#!/bin/bash 
trap "xdotool key Ctrl+A Ctrl+k Return" SIGINT; 
unset command 
while [ "$command" != "quit" ] ;do 
    eval $command 
    read -e -p "$USER - SHIELD: `pwd`> " command 
    done 
trap SIGINT 

Ama şiddetle KKO için ... `` ayıklama '' anahtar kelimesi ararken davet ...

man -Pless\ +/debug bash 
+0

xdotool% 100 hack olarak, hile yapardı. Bir '^ C^A^K' ve saf bash (sadece '^ C') göstermeyecek boş bir satır olsun, ama hiçbir şeyden daha iyidir. Her neyse, xdotool'a bağlı olmamak ve bu ekstra işaretleyicileri önlemek için harika olurdu. Neyse, rtfm davetini almadım ... Hata ayıklama bana ne gösterir? – mgarciaisaia

+0

Evet, bu büyük bir hack. Ama eyalette, bu iş yapıyor. Orijinal fikri takip etmenin doğru yolu, ioctl aracılığıyla dosya tanımlayıcılarına erişmelidir. –

+0

@mgarciaisaia Ne hakkında * hata ayıklama * ve nasıl kullanılabilir. [nanosaniye cinsinden profiling bash] 'a bir göz atın (http://stackoverflow.com/a/20855353/1765658) –

İlgili konular