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 -100
为tail -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
然后清理你的历史来制作一个漂亮的脚本!