Bash

讀歷史

  • August 12, 2016

如何read通過按向上/向下鍵循環瀏覽內置命令支持歷史記錄?

當您按下向上鍵時,我嘗試過捕捉,但它似乎不適用於read

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

按箭頭鍵似乎可以工作,我可以使用它來檢測它,但是如果我按a``a``↑,它將失敗,因為它只會讀取向上箭頭標識符的第一個字元,而需要第三個字元來區分不同的箭頭鍵。

rlwrap如果您不介意安裝軟體,您可以使用它。

您可能希望保留一個單獨的歷史文件,該文件僅維護腳本中特定提示的歷史記錄(即避免與使用者的 shell 命令歷史記錄混合)。

這是一個可能對您有用的範例:

#!/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。根據需要進行調整。

或者,您可以使用 bash’s read -e,它為呼叫啟用 readline read,但您可能會發現它的歷史功能太有限(即幾乎不存在)。

要從這個舊的郵件列表文章中複製 Mike Stroyan 的精彩回答:

您可以使用“history -r”將文件讀入shell的歷史記錄,並使用“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

引用自:https://unix.stackexchange.com/questions/52091