历史是Shell内置命令,我无法在BASH脚本中使用它。那么,有没有一种方法可以使用BASH脚本来实现?
在这里,我们为您准备了我的脚本:
#!/bin/bash
history | tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt | mail -s "History log of server" hello@hel.com
历史是Shell内置命令,我无法在BASH脚本中使用它。那么,有没有一种方法可以使用BASH脚本来实现?
在这里,我们为您准备了我的脚本:
#!/bin/bash
history | tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt | mail -s "History log of server" hello@hel.com
Answers:
Bash默认情况下会禁用非交互式Shell中的历史记录,但是您可以将其打开。
#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail …
但是,如果您要监视该服务器上的活动,则shell历史记录是无用的(运行历史记录中未显示的命令很简单)。请参阅如何在Linux中记录所有进程启动。
如果您要调试脚本,则shell历史记录不是获取有用信息的最佳方法。更好的工具是调试跟踪工具:放在set -x
脚本顶部附近。跟踪被写入标准错误。
sh
错误消息的确切措辞使您破晓不绝)。要访问bash的历史记录,您需要使用bash(以#!/bin/bash
或开头的脚本#!/usr/bin/env bash
)。
Illegal option
(会显示set: history: invalid option name
)。
set -o history
的历史则其将要与像条目鼻塞if [...
vars=$(...
等
set -x
它会有用得多。
我不确定在非交互运行时它是否实际上使用了历史记录功能,否则运行的每个shell脚本都会使命令历史记录混乱。
为什么不直接进入源代码${HOME}/.bash_history
,而替换history | tail -100
为tail -100 ${HOME}/.bash_history
。(如果您使用时间戳记,则可能必须按照进行操作grep -v ^# ${HOME}/.bash_history | tail -100
)。
greq -v '^#[0-9]\+$'
(我有时会在外壳中“执行”评论...)
history
的输出与grep
方法的输出之间存在差异……
history -a; history -c; history -r
。(添加,清除,阅读)
如果要history
在脚本中使用活动外壳程序会话中命令的输出,可以先使用别名来运行命令。然后,以相同的别名,您可以调用脚本的其余部分。通过这样的配置,您可以获得与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" hello@hel.com
我在编写将~/bash_history
两台计算机上的文件进行组合,排序和同步的过程时发现了这个问题,因此可以轻松搜索我过去使用的命令。
更新我的累积历史记录文件而不必登录到新的Shell进行~/bash_history
更新就省去了很多麻烦。如其他答案中所述,对于监视服务器,这显然不起作用。
我的用法尤其是:
alias hbye='history | cut -c 8- > /home/chris/.bash_history_c; bash /hby.sh
然后,脚本hby.sh
从所有~/.bash_history*
文件中提取所有唯一条目。
内置历史记录似乎已在Shell脚本中禁用。参见此处:http : //www.tldp.org/LDP/abs/html/histcommands.html
我尚未找到有关此的任何官方文档。
创建一个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行运行中一直在进行
script.sh task 14
然后整理您的历史记录,制作出精美的脚本!
histtest.sh: 5: set: Illegal option -o history
简短答案:
用于history -p
显式执行历史记录扩展。
下面是一个示例。
我经常遇到的一种用例是:
由于我的bash已经 set -o histexpand
,通常我所做的就是输入
vim $(!!)
编辑上一个命令列出的文件。
遗憾的是有时会发生错误,因此我启用了验证shopt -s histverify
。
现在,我可以验证扩展了,但要多花一分钱 Return密钥。
今天,由于我经常使用这些细节,因此我想将这些细节包装到bash函数中,
function vk() {
set -o history && set -o histexpand;
vim -i ~/.viminfok $($(history -p !!));
}
在这里,我使用了两个nested command substitution
,内部的一个扩展!!
为上一个命令,外部的一个执行它并获取输出。
现在,我只需三个键就可以达到相同的效果,其中之一就是Return!
histtest.sh: 5: set: Illegal option -o history