bash 脚本中的历史命令

bash 脚本中的历史命令

History 是 shell 内置命令,我无法在 BASH 脚本中使用它。那么,有没有办法使用 BASH 脚本实现这一点?
这是我为您准备的脚本:

#!/bin/bash
history |  tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" [email protected]

答案1

默认情况下,Bash 在非交互式 shell 中禁用历史记录,但您可以将其打开。

#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail …

但是,如果您尝试监视该服务器上的活动,则 shell 历史记录是无用的(运行历史记录中未显示的命令是微不足道的)。看如何记录 Linux 中的所有进程启动

如果您正在调试脚本,那么 shell 历史记录并不是获取有用信息的最佳方式。一个更好的工具是调试跟踪工具:放置set -x在脚本顶部附近。跟踪被写入标准错误。

答案2

我不确定它在非交互式运行时是否真正使用历史记录功能,否则您运行的每个 shell 脚本都会弄乱您的命令历史记录。

为什么不直接去找源码${HOME}/.bash_history,替换history | tail -100tail -100 ${HOME}/.bash_history. (如果您使用时间戳,您可能必须按照以下方式执行某些操作grep -v ^# ${HOME}/.bash_history | tail -100)。

答案3

如果要history在脚本中使用活动 shell 会话的命令输出,可以先使用别名运行该命令。然后,您可以使用同一别名调用脚本的其余部分。通过这样的配置,您可以获得与history在实际脚本中使用命令基本相同的结果。

例如,您可以创建这样的别名,假设脚本的名称是 script.sh:

alias hy_tmp='history | tail -100 > /tmp/history.log ; bash /patch/to/script.sh'

并将脚本更改为:

#!/bin/bash
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" [email protected]

我在编写一个在两台计算机上组合、排序和同步~/bash_history文件的过程时发现了这个问题,这样就可以很容易地搜索我过去使用过的命令。

更新我的累积历史记录文件要简单得多,而无需登录到新的 shell 来进行~/bash_history更新。对于监视服务器,这显然不起作用,正如其他答案中提到的。

我的具体用法是:

alias hbye='history | cut -c 8- > /home/chris/.bash_history_c; bash /hby.sh

然后,该脚本hby.sh从所有文件中提取所有唯一条目~/.bash_history*

答案4

script.sh创建一个名为如下的脚本。它创建一个名为 X 的脚本,并将 Y 行历史记录放入其中。

#!/bin/bash
SCRIPT_NAME=$1
NUMBER_OF_LINES_BACK=$2

# Enable History in a non interactive shell
HISTFILE=~/.bash_history
set -o history

# echo shabang line and x number of lines of history to new script
echo \#\!\/bin\/bash > $SCRIPT_NAME.sh; history | tail -n $NUMBER_OF_LINES_BACK >> $SCRIPT_NAME.sh;
chmod u+x $SCRIPT_NAME.sh;

# Open the newly created script with vim
vim $SCRIPT_NAME.sh;
~

然后,如果您想创建一个脚本来完成您在最后 14 行中一直在处理的名为“task”的任务,请运行

script.sh task 14

然后清理你的历史来制作一个漂亮的脚本!

相关内容