假设我有一个包含以下内容的交互式脚本:
#!/bin/bash
...
...
while read -p "> " CMD
do
...
...
done
...
...
是否可以实现"命令召回"?我想按向上箭头键并运行先前输入的命令。
答案 0 :(得分:0)
可以在bash
脚本中调用命令。这是一个脚本hist.sh
,它运行一个命令,给出bash
历史中向后的相对偏移量:
#!/bin/bash
HISTFILE=$(mktemp bhXXXXXX)
set -o history
shopt -s expand_aliases
alias e=:
e one
e two
e three
e four
e five
e six
alias e=echo
EDITOR=: fc -n $((HISTCMD - (2+$1) )) 2> /dev/null | tr '[a-z]' '[A-Z]'
rm $HISTFILE
保存它,并通过输入1到6的数字进行测试:
hist.sh 5
hist.sh 1
输出:
TWO
SIX
注意:
e
和alias
内容是装饰性的,它缩短了输出。例如,第一次e six
运行时,bash
会将其解释为: six
,但不执行任何操作。第二次e six
运行时,bash
会将其解释为echo six
。
在脚本中,历史记录和别名默认不起作用,因此set
和shopt
会重新激活它们。
$HISTFILE
设置为临时文件,因此历史记录仅适用于此脚本。
fc
可以在历史记录中运行任何命令,但需要输入绝对数字,例如 345 。但是当历史记录变满时,这些数字会向上滚动,因此在一个命令之后 345 的命令会在另一个命令之后变为 344 。当前命令编号存储在$HISTCMD
中,此处用于计算偏移量。
fc
通常在运行之前将命令发送到文本编辑器。将$EDITOR
设置为像:
这样的无操作命令会阻止这种情况。
tr
用于将文字转换为大写字母,这有助于显示fc
实际上正在运作。