2016-11-19 16 views
1

私はbashの読み込み機能を使いこなしています。私は今のところ私の現在のシェルの上にシンプルなレイヤーがあるのが好きです。 read -eはタブ完了とそれ以前のコマンドを実行し、ctrl + dでEOFを送信すると元のシェルに戻ります。私はSIGINT、Ctrl + Cを扱ういくつかの助けが欲しいbashのstdinから読み込むときに割り込み信号を処理する方法

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

:ここに私の参照です。通常のシェルでは、入力を開始して^ Cキーを半押しすると、直ちに行が終了します。この単純な例では、^ Cの後に、登録する前にリターンする必要があります。

どうすればいいですか?readlineのやり方は変わりませんが、SIGINTは正しく処理されますか?理想的には、while文をwhileループに送り、何とか\ 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信号の読み出しがあれば、いくつかのシステムコールは、いくつかのシステムコールのコマンド

に戻ります結果として設定再開フラグを持っていることを告げます呼び出しが である間に信号が捕捉され、呼び出しが途中で終了した場合は、 が自動的に再起動されます。 signal(3)でインストールされたハンドラには にSA_RESTARTフラグが設定されます。つまり、再起動可能なシステムコール はシグナルを受信して​​も返されません。影響を受けるシステムは、通信チャネルまたは低速デバイス上のread(2)、write(2)、sendto(2)、recvfrom(2)、sendmsg(2)、および recvmsg(2) ioctl(2)またはwait(2)。ただし、既に がコミットされているコールは再起動されず、代わりに部分的に成功します( の場合、短い読み取り回数)。これらのセマンティクスは、 siginterrupt(3)で変更できます。

行に値の入力を印刷して、改行がヒットするまでCtrlCが戻った後に読み取りが再開されることを確認できます。 「exit」、「Ctrl-C」、「exit」のような形式を入力して、「exitexit」として出力します。あなたは

として出力があなたにもCプログラムでこれを確認することができます

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

次のように変更を加えて、上記のテストケースのために実行します。

+0

「exit」と入力してCtrl-Cを押すと、終了してから新しいプロンプトを表示したいと思っています。 – CGanote

関連する問題