2

私はbashの読み取り機能をいじっています。現在のシェルの上にあるシンプルなレイヤーとして、これまでのところ気に入っています。read -e はタブ補完と前のコマンドを実行し、ctrl+d で EOF を送信すると、元のシェルに戻ります。ここに私の参照があります:

Bash (または他のシェル): すべてのコマンドを関数/スクリプトでラップします。

SIGINT、ctrl+c の処理についてヘルプが必要です。通常のシェルでは、入力を開始して途中で ^C を押すと、すぐに行が終了します。この単純な例では、^C の後、登録される前にリターン キーを押す必要があります。

readline が行う優れた機能を維持しながら、SIGINT を正しく処理するにはどうすればよいですか? 理想的には、continue ステートメントを while read ループに送信するか、読み取りが待機している STDIN に何らかの方法で \n を送信します。

コード例:

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

2 に答える 2

-1

man 7シグナルを読むと、一部のシステムコールに再起動可能なフラグが設定されていることがわかり、その結果、コマンドに戻ります

一部のシステム コールでは、コールの実行中にシグナルが捕捉され、コールが途中で終了した場合、コールは自動的に再開されます。signal(3) を使用してインストールされたハンドラーには、SA_RESTART フラグが設定されます。これは、再起動可能なシステム コールがシグナルを受信して​​も返されないことを意味します。影響を受けるシステム コールには、通信チャネルまたは低速デバイス上で、ioctl(2) ) または待機 (2)。ただし、既にコミットされている呼び出しは再開されませんが、代わりに部分的な成功 (短い読み取りカウントなど) が返されます。これらのセマンティクスは、siginterrupt(3) で変更できます。

値の入力を行に出力してみて、CtrlC が戻った後、新しい行に到達するまで読み取りが再開されることを確認できます。「exit」のように入力し、その後に Ctrl-C を入力してから「exit」と入力すると、「exitexit」という出力が表示されます。次の変更を加えて、上記のテスト ケースを実行します。

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

出力は次のようになります

これは C プログラムでも確認できます。

于 2016-11-19T08:54:49.000 に答える