2012-10-24 109 views
6

我正在寫一個bash包裝來學習一些腳本概念。這個想法是在bash中編寫腳本,並在登錄時將其設置爲用戶的shell。SIGINT取消在bash腳本中讀取?

我做了一個while循環,其中read s和eval的用戶輸入,然後注意到,無論何時用戶鍵入CTRL + C,腳本都會中止以便用戶會話結束。

爲了避免這種情況,我困住了SIGINT,在陷阱裏什麼也沒做。

現在,問題是,當您在命令的一半處鍵入CTRL + C時,它不會被取消,因爲它可能會在bash上執行 - 它只是忽略CTRL + C

所以,如果我輸入ping stockoverf^Cping stackoverflow.com,我得到ping stockoverfping stackoverflow.com,而不是我想要的ping stackoverflow.com

有沒有辦法做到這一點?

#!/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 

回答

3

你可以使用一個工具,如xdotool發送按Ctrl-A(開始的行)按Ctrl-K(刪除到結束行)返回(以清理線)

#!/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 

但我強烈邀請你RTFM ......在尋找``調試'關鍵字...

man -Pless\ +/debug bash 
+0

xdotool會做的伎倆,以100%的黑客攻擊。你得到一個'^ C^A^K'和一個空行,不會在純粹的bash中顯示(只是'^ C'),但它總比沒有好。無論如何,不​​依賴於'xdotool'並且避免那些額外的標記 - 比如說,就像bash的作品一樣。無論如何,我沒有得到rtfm邀請......應該調試什麼給我看? – mgarciaisaia

+0

是的,這是一個巨大的破解。但在國家,這是做這項工作。遵循原始想法的正確方法需要通過ioctl訪問文件描述符。 –

+0

@mgarciaisaia關於* debug *可以做什麼以及如何使用它。看看[profiling bash in nanoseconds](http://stackoverflow.com/a/20855353/1765658) –