2016-11-19 67 views
1

我在玩bash讀取功能。我喜歡我目前shell中的一個簡單圖層。讀-e沒有tab-complete和以前的命令,並且用ctrl + d發送EOF讓我回到我的原始shell。這裏是我的參考:如何處理從bash中的標準輸入讀取中斷信號

Bash (or other shell): wrap all commands with function/script

我想一些幫助處理SIGINT,CTRL + C。在一個正常的shell中,如果你開始輸入並在中途點擊^ C,它會立即結束該行。對於這個簡單的例子,在^ C之後,我仍然必須在註冊之前返回。

我該如何保持readline所具有的好處,但仍能正確處理SIGINT?理想情況下,它會向while循環發送continue語句,或者以某種方式將\ n發送到STDIN,在那裏等待我的讀取。

示例代碼:

#!/bin/bash 
# Emulate bash shell 

gtg=1 

function handleCtrl-C { 
    # What do I do here? 
    gtg=0 
    return 
} 

trap handleCtrl-C INT 

while read -e -p "> " line 
do 
    if [[ $gtg == 1 ]] ; then 
     eval "$line" 
    fi 
    gtg=1 
done 

回答

0

讀書人7信號告訴一些系統調用的可重新啓動的標誌設置,結果將返回到命令

對於某些系統調用,如果信號在執行呼叫 時被捕獲,並且呼叫過早終止,呼叫自動重新啓動的 。任何安裝了信號(3)的處理程序將 都設置了SA_RESTART標誌,這意味着任何可重新啓動的系統調用 在收到信號後都不會返回。受影響的系統調用 包括讀取(2),寫入(2),sendto(2),recvfrom(2),sendmsg(2)和 recvmsg(2)在通信通道或低速設備上,以及 ioctl(2)或等待(2)。但是,已提交 的呼叫未重新啓動,而是返回部分成功(對於 示例,讀取次數較短)。這些語義可以用 siginterrupt(3)進行更改。

您可以嘗試打印輸入到行的值,並確認在CtrlC返回之後讀取被恢復,直到命中新行。輸入類似「exit」的內容,然後按Ctrl-C,然後「退出」輸出結果爲「exitexit」。作如下改動並運行上述測試案例

echo ">$line<" 
if [ $gtg == 1 ] ; then 

你會輸出作爲

你可以用一個C程序驗證這一點。

+0

我不確定這是我想要的 - 如果我輸入'exit'並按下Ctrl-C,我希望它丟棄退出並給我一個新的提示。 – CGanote