在bash / ksh脚本中调用命令

时间:2018-04-24 17:11:58

标签: bash shell unix ksh

假设我有一个包含以下内容的交互式脚本:

#!/bin/bash
...
...
while read -p "> " CMD
do
        ...
        ...
done
...
...

是否可以实现"命令召回"?我想按向上箭头键并运行先前输入的命令。

1 个答案:

答案 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

注意:

  • ealias内容是装饰性的,它缩短了输出。例如,第一次e six运行时,bash会将其解释为: six,但不执行任何操作。第二次e six运行时,bash会将其解释为echo six

  • 在脚本中,历史记录和别名默认不起作用,因此setshopt会重新激活它们。

  • $HISTFILE设置为临时文件,因此历史记录仅适用于此脚本。

  • fc可以在历史记录中运行任何命令,但需要输入绝对数字,例如 345 。但是当历史记录变满时,这些数字会向上滚动,因此在一个命令之后 345 的命令会在另一个命令之后变为 344 。当前命令编号存储在$HISTCMD中,此处用于计算偏移量。

  • fc通常在运行之前将命令发送到文本编辑器。将$EDITOR设置为像:这样的无操作命令会阻止这种情况。

  • tr用于将文字转换为大写字母,这有助于显示fc实际上正在运作。