bash - bash/ksh 脚本中的命令调用
问题描述
假设我有一个交互式脚本,里面有以下内容:
#!/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
确实有效。
推荐阅读
- sql-server - 创建 Azure SQL 数据库时如何获取最新的 SQL Server 版本
- c++ - 带有 glm::frustum 闪烁的倾斜/离轴立体投影
- sql-server - SSIS:为什么序列容器需要 TransactionOption 才能报告任务失败?
- c# - 如何确保覆盖线程代码
- python - 如何使用python从谷歌云读取mp3数据
- excel - 更改模块 - 一键切换按钮 vba excel
- python - Python:将字母加序号作为值添加到字典键
- jquery - 将 jquery 变量连接到 Rails 部分
- java - 如何将 URI 值存储到 Andriod Studio 中的存储参考变量
- .htaccess - 如何使用 .htaccess 在子目录中使用查询重写 URL