read組み込みコマンドを循環させるために上/下キーを押して記録をサポートする方法は?

上キーを押したときにキャッチしようとしましたが、うまくいかないようですread

read -p '> ' -n 3 foo
echo
echo -n "$foo" | hexdump

矢印キーを押すと機能しているようで、それを使用して検出できますが、押すと上aa矢印識別子の最初の文字だけを読み、他の矢印キーを区別するには3番目の文字が必要なため失敗します。

答え1

Mike Stroyanの素晴らしい回答をコピー古いメーリングリストの投稿:

「history -r」を使用してシェルの履歴としてファイルを読み取ることができ、「history -s」を使用して読み取った各行を履歴に追加できます。次に、履歴 -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

答え2

あなたはそれを使用することができます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リードライン機能、履歴は-によって提供され、保存されます  ~/.myscript_history。必要に応じて調整してください。

read -eあるいは、readline呼び出しをサポートするbashを使用することもできますが、read履歴機能があまりにも制限的(つまり、ほとんど存在しない)を見つけることができます。

関連情報