gpt4 book ai didi

bash - 使用 `read` 时如何启用向上/向下箭头键以显示以前的输入?

转载 作者:行者123 更新时间:2023-11-29 08:48:15 25 4
gpt4 key购买 nike

我在无限循环中等待用户输入(使用“读取”),并希望拥有命令历史记录,即能够使用向上和向下箭头键显示已经输入的先前输入,而不是得到 ^[[A 和 ^[[B。这可能吗?


感谢@l0b0 的回答。它让我走上了正确的方向。玩了一段时间后,我意识到我还需要以下两个功能,但我还没有设法得到它们:

  • 如果我按下向上键并向上一个命令添加一些内容,我希望将整个内容保存在历史记录中,而不仅仅是添加内容。示例

    $ ./up_and_down
    输入命令:你好
    进入
    输入指令:
    向上
    输入指令:你好
    进入
    输入指令:
    向上
    输入命令:你
    (而不是“你好”)

  • 如果因为我在历史数组的末尾而无法继续向上移动,我不希望光标移动到上一行,而是希望它保持固定。

这是我目前所拥有的(up_and_down):

#!/usr/bin/env bash
set -o nounset -o errexit -o pipefail

read_history() {
local char
local string
local esc=$'\e'
local up=$'\e[A'
local down=$'\e[B'
local clear_line=$'\r\e[K'


local history=()
local -i history_index=0

# Read one character at a time
while IFS="" read -p "Enter command:" -n1 -s char ; do
if [[ "$char" == "$esc" ]]; then
# Get the rest of the escape sequence (3 characters total)
while read -n2 -s rest ; do
char+="$rest"
break
done
fi

if [[ "$char" == "$up" && $history_index > 0 ]] ; then
history_index+=-1
echo -ne $clear_line${history[$history_index]}
elif [[ "$char" == "$down" && $history_index < $((${#history[@]} - 1)) ]] ; then
history_index+=1
echo -ne $clear_line${history[$history_index]}
elif [[ -z "$char" ]]; then # user pressed ENTER
echo
history+=( "$string" )
string=
history_index=${#history[@]}
else
echo -n "$char"
string+="$char"
fi
done
}
read_history

最佳答案

使用 -e 选项和内置 history 命令的 read 选项的两种解决方案:

# version 1
while IFS="" read -r -e -d $'\n' -p 'input> ' line; do
echo "$line"
history -s "$line"
done

# version 2
while IFS="" read -r -e -d $'\n' -p 'input> ' line; do
echo "$line"
echo "$line" >> ~/.bash_history
history -n
done

关于bash - 使用 `read` 时如何启用向上/向下箭头键以显示以前的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6788777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com