在Bash脚本中如何获取“上一个执行的命令”?

11

我使用多个bash会话,并且希望将它们的历史记录保存在一个文件中(我不在乎它是从多个会话复用的,我可以在前面放一个会话标识符)。我尝试过执行以下操作:

shopt -s histappend

并且加上

history -a 

有很多方法可以将历史命令记录到Bash的$HISTFILE文件中,包括将PROMPT_COMMAND变量设置为一条记录历史命令的命令。但这些方法对我来说并不奏效,我也不知道为什么它们不行(据我观察,它们的行为非常不确定...有时会同时记录多个会话的命令,有时则不会)。

本问题的目标是探索一种替代的方式来记录所有会话的历史命令,以便我可以控制要写入历史记录的内容。想法是将“上一个命令”存储在一个shell变量中,然后在PS1变量的定义中将该变量回显到一个历史日志文件中。

问题是:如何将“上一个执行的命令”获取到一个shell变量中?我知道可以在交互式Bash会话中执行echo !! >> logfile.txt将其记录到日志文件中。但是在脚本文件(或.bashrc文件)中如何实现呢?

我已经尝试过:

PROMPT_COMMAND="PC=$_;"
PREVIOUS_COMMAND=$(echo $PC)  # $_ only gives the last argument of previous command
export PS1="[\u@\h \w] [$PREVIOUS_COMMAND $(echo $_) $_] $ "

但是这些都不起作用。

感谢您的时间, ~yogi


你可以尝试使用Bash的变量$BASH_COMMAND来执行一些操作。 - Carlos Campderrós
1个回答

15

类似以下内容:

fc -ln -1

应该可以工作。话说,你可能遇到了并发访问问题(即:多个终端互相覆盖历史记录),手动操作可能也无法解决。


哇!真快,而且正是我想要的。我已经检查了并发问题。我刚刚要求两个bash脚本在10秒内发送当前时间戳并将它们附加到文本文件中。输出行有一定的顺序,但每行都来自其中一个脚本,而不是来自两个不同脚本的两行组合。我希望这是附加到文本文件时的正确行为。 - Yogeshwer Sharma
1
我现在正在编写以下代码: export PS1=[`fc -ln -1` : $(fc -ln -1) : `date`] 但是我没有得到我想要的结果。日期可以正常打印,但是fc输出不行。你们有什么想法吗? - Yogeshwer Sharma
你需要在其中使用单引号来防止定义过程中的 `$() 被扩展。export PS1='[$(fc -ln -1) : $(date)] ' 或类似的东西——尽管我不得不想知道是否有一些格式丢失了。 - geekosaur
是的,我已经放置了那些引号。但它仍然没有做它应该做的事情! :-( - Yogeshwer Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接