歴史とともに読む


11

read上/下キーを押してそれらを循環することで、組み込みコマンドサポート履歴を作成するにはどうすればよいですか?

あなたがアップキーを押したときにキャッチしようとしましたが、それは動作しないようですread

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

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

回答:


8

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 -ereadlineを有効にするbashを使用できますが、readその履歴機能が制限されすぎる(つまり、ほとんど存在しない)ことに気付くでしょう。


10

この古いメーリングリストの投稿から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(少なくとも私のマシンでは)rlwrapCTRL-Cを適切に処理できないよりもこの解決策が好きです。たとえば、実行USERINPUT=$(rlwrap -o cat)してCTRL-Cを押して、ターミナルの動作を確認します(resetコマンドを実行して、正常な状態に戻ります)。 。
zpon

これは、追加のlibをインストールする必要がなく、別のファイルを使用して入力を管理することに満足している場合、非常にうまく機能します。
ルークエクストン2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.