Bash
讀歷史
如何
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
,它為呼叫啟用 readlineread
,但您可能會發現它的歷史功能太有限(即幾乎不存在)。
要從這個舊的郵件列表文章中複製 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