首页 > 解决方案 > bash/ksh 脚本中的命令调用

问题描述

假设我有一个交互式脚本,里面有以下内容:

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

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

标签: bashshellunixksh

解决方案


可以在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.

  • 在脚本中,历史和别名在默认情况下不起作用,因此请set重新shopt激活它们。

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

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

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

  • tr用于将文本转换为大写,这有助于表明它fc确实有效。


推荐阅读