一个脚本中的历史和 egrep

History and egrep in one script

我必须输入:

history | egrep ssh

每次我想搜索我最新的 ssh 连接时。

然后我有了一个想法,如何将它们放在一个脚本中。我称之为 histgrep.sh

#!/bin/bash
history | /bin/egrep ""

但是,每次我调用 histgrep.sh ssh,它不会产生任何结果。

谁能帮我解决这个问题?或者您有其他解决方案吗?

转换回回答自动转换为评论的(琐碎的)答案:)

历史记录在非交互式 bash shell 中默认禁用,但可以重新启用,请参阅此问答:https://unix.stackexchange.com/questions/5684/history-command-inside-bash-script

是的,从脚本本身使用 !<num> 是行不通的,但是在 shell 调用脚本时(问题中明显的预期使用上下文)它工作得很好:

> cat histgrep.sh 
#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | egrep ""
> ./histgrep.sh 'ls -la'
...
  460  ls -la *
> !460
ls -la *
-rw-rw-r--. 1 userid at    24167 Nov 21  2012 cfu
-rwxrwxr-x  1 userid at       73 Jul 10 00:23 histgrep.sh
-rwxrwxr-x. 1 userid users  2025 Apr  2  2013 same_file.py
-rwxrwxr-x  1 userid at      385 Jun 25 13:01 tst.py
-rwxrwxr-x  1 userid at      310 Jul  9 23:58 tst.sh

简单的解决方案,使用 bash 别名。

在终端上输入:

alias histgrep="history | grep"

使用方法:

histgrep ssh

以上命令等于history | grep ssh

参考:

An Introduction to bash aliases and functions

history 命令适用于您当前 shell 的上下文,因此从脚本调用它不会(简单地)起作用。 shell 函数确实可以访问当前 shell 的上下文,因此将类似这样的内容添加到您的 .bashrc 或类似内容中即可。

histgrep () { history | egrep "$@"; }

从技术上讲,别名也可以,但通常没有充分的理由更喜欢别名而不是函数。