回答:
rlwrap
ソフトウェアのインストールを気にしなければ、これに使用できます。
スクリプト内の特定のプロンプトの履歴のみを維持する個別の履歴ファイルを保持することをお勧めします(つまり、ユーザーのシェルコマンド履歴と混同しないようにします)。
これはあなたのために働くかもしれない例です:
#!/bin/sh
# Save in rlwrap_example.sh
HISTORY=$HOME/.myscript_history
USERINPUT=$(rlwrap -H $HISTORY sh -c 'read REPLY && echo $REPLY')
echo "User said $USERINPUT"
$ ./rlwrap_example.sh
hello
User said hello
上記のスクリプトでは、ユーザーはすべてのGNU readline機能を使用でき、履歴はから提供され、に保存され ~/.myscript_history
ます。必要に応じて調整します。
または、呼び出しのread -e
readlineを有効にするbashを使用できますが、read
その履歴機能が制限されすぎる(つまり、ほとんど存在しない)ことに気付くでしょう。
この古いメーリングリストの投稿からMike Stroyanのすばらしい回答をコピーするには、次のようにします。
「history -r」を使用してファイルをシェルの履歴に読み込み、「history -s」を使用して、読み込んだ各行を履歴に追加できます。次に、history -wを使用して、履歴をファイルに保存します。これは、viスタイルのreadline編集の例です。
#!/bin/bash
history -r script_history
set -o vi
CMD=""
while true
do
echo "Type something"
read -e CMD
history -s "$CMD"
echo "You typed $CMD"
case "$CMD" in
stop)
break
;;
history)
history
;;
esac
done
history -w script_history
echo stopping
rlwrap
(少なくとも私のマシンでは)rlwrap
CTRL-Cを適切に処理できないよりもこの解決策が好きです。たとえば、実行USERINPUT=$(rlwrap -o cat)
してCTRL-Cを押して、ターミナルの動作を確認します(reset
コマンドを実行して、正常な状態に戻ります)。 。