在脚本中使用交互式的 shell 历史扩展

在脚本中使用交互式的 shell 历史扩展

我有以下 Bash 脚本

set -o histexpand
set -o history
pwd
lc="!!"

当我在交互式 shell 中运行它时,会打印

/home/user
lc="pwd"

我想lc=pwd通过使用历史扩展来获取交互式 shell 中使用的最后一个命令,而不是获取 。所以如果我跑步echo foo; ./script,我希望得到

/home/user
lc="echo foo"

我在脚本中尝试过set -H,但没有成功。

答案1

使用 shell 的历史扩展来获取在运行脚本之前在 shell 会话中执行的命令是不可行的,除非调用 shell 将其历史记录保存到$HISTFILE每个执行的命令之后(bash默认情况下不会这样做)并导出HISTFILE变量,不需要做。

默认情况下,bashshell 会在内存中维护当前交互式 shell 会话的历史记录。该历史记录将$HISTFILE在 shell 会话退出时保存。当启用命令行历史记录的新会话启动时,将从该文件中读取保存的历史记录(假设新 shell 使用相同的$HISTFILE值)。

您的脚本,除非它具有HISTFILE从其调用环境继承的变量,否则最多只能访问其自己会话的命令行历史记录,即脚本中的命令。如果HISTFILE导出,但如果调用 shell$HISTFILE在运行脚本之前从未保存其历史记录,则无法获取该父 shell 会话的内存历史记录,并且您最多只能访问会议早已消亡。

相关内容