6

いくつかのスクリプトの概念を学ぶために、bash ラッパーを作成しています。アイデアは、bash でスクリプトを作成し、ログイン時にユーザーのシェルとして設定することです。

ユーザーの入力に対して while ループを作成したreadところ、ユーザーが を入力するたびにスクリプトが中止され、ユーザー セッションが終了するevalことに気付きました。CTRL + C

これを避けるためSIGINTに、トラップ内で何もせずに をトラップしました。

ここで、問題はCTRL + C、コマンドの半分を入力しても、bash の場合のようにキャンセルされず、単に無視されることCTRL + Cです。

したがって、 と入力すると、必要な の代わりping stockoverf^Cping stackoverflow.comに取得されます。ping stockoverfping stackoverflow.comping 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
4

2 に答える 2

3

xdotool のようなツールを使用して、Ctrl-A (行頭) Ctrl-K (行末への削除) Return (行をクリーンアップするため) を送信できます。

#!/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 に強く招待します... ``debug'' キーワードを検索すると...

man -Pless\ +/debug bash
于 2012-10-24T22:34:37.097 に答える