我有以下 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
变量,不需要做。
默认情况下,bash
shell 会在内存中维护当前交互式 shell 会话的历史记录。该历史记录将$HISTFILE
在 shell 会话退出时保存。当启用命令行历史记录的新会话启动时,将从该文件中读取保存的历史记录(假设新 shell 使用相同的$HISTFILE
值)。
您的脚本,除非它具有HISTFILE
从其调用环境继承的变量,否则最多只能访问其自己会话的命令行历史记录,即脚本中的命令。如果HISTFILE
导出,但如果调用 shell$HISTFILE
在运行脚本之前从未保存其历史记录,则无法获取该父 shell 会话的内存历史记录,并且您最多只能访问会议早已消亡。