【问题标题】:Command recall within bash/ksh scriptbash/ksh 脚本中的命令调用
【发布时间】:2018-04-24 17:11:57
【问题描述】:

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

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

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

【问题讨论】:

标签: bash shell unix ksh


【解决方案1】:

可以在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 确实有效。

【讨论】:

  • 装饰部分的有趣之处在于aliases 可以用作polymorphism 的粗略形式,而bash 单独的函数是做不到的。
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2015-04-24
  • 2015-04-27
  • 2018-03-10
  • 1970-01-01
相关资源
最近更新 更多