bash/ksh脚本中的命令调用

bash/ksh脚本中的命令调用,bash,shell,unix,ksh,Bash,Shell,Unix,Ksh,假设我有一个内部包含以下内容的交互式脚本: #!/bin/bash ... ... while read -p "> " CMD do ... ... done ... ... 是否可以实施“命令调用”?我想按向上箭头键并运行以前输入的命令。可以在bash脚本中调用命令。下面是一个脚本hist.sh,该脚本在bash历史记录中以相对偏移量向后运行命令: #!/bin/bash HISTFILE=$(mktemp bhXXXXXX) set -o hist

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

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

是否可以实施“命令调用”?我想按向上箭头键并运行以前输入的命令。

可以在
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
    实际工作


顺便说一句,在我们的姐妹网站In bash
上也有人问过这个问题将重复前面的命令,如果这是您的意思…嗯
read-e
将为您提供行编辑功能,但向上/向下箭头使用您的命令历史记录,这在脚本中是不可用的。外观部分的有趣之处在于,
alias
es可以用作的原始形式,而
bash
函数本身无法做到这一点。