Perl脚本与Unix命令“历史”具有相同的功能?

时间:2011-07-08 05:28:59

标签: perl unix

是否可以编写Perl脚本来获取Unix命令的历史记录?这意味着编写一个与Unix命令“历史”具有相同功能的Perl脚本?

我尝试使用tcsh历史记录,但历史记录不包含最新的Unix命令。只有关闭当前的xterm后才能使用最新版本。有没有办法解决它而不关闭xterm?

我在其他帖子中看到了PROMPT_COMMAND ='history -a'的内容,如何使用它? T.T

感谢。

2 个答案:

答案 0 :(得分:2)

您可以通过编辑主目录中的.tcshrc文件来控制此行为。

如果别名为precmd,则会在显示每个提示之前运行。您想要的命令是history -S,它将强制保存您当前的历史记录。 假设您一次运行多个终端,您还需要设置savehist以便它合并所有历史记录而不是仅覆盖。如果没有合并选项,历史文件将被当前终端的历史记录覆盖,但只要您转到另一个窗口,历史记录将被 终端的历史记录覆盖。

因此,假设您要保留500行历史记录(合并),以下是您需要添加到~/.tcshrc文件中的两行。请注意,除非您更改histfile,否则您的历史记录将在~/.history中找到:

set savehist = (500 "merge")
alias precmd "history -S"

最后,我强烈建议(与@Mimisbrunnr达成一致意见)您要考虑使用bashzsh,因为他们已将tcsh的最佳部分合并到一起凭借Bourne shell(sh)的力量,消除了csh的所有弱点。

哦......如果你想要一个perl脚本来获取历史记录,请使用类似的东西:

#!/usr/bin/perl
use strict;
use warnings;

open my $hist_fh, '<', "$ENV{HOME}/.history"  or die "Cannot open history file: $!\n";

my @history;
while (<$hist_fh>) {
    chomp;
    next if /^#/;  # Skip timestamps
    push @history, $_;
}
close $hist_fh;

print "Now I have my history in an array, the latest thing I did was: $history[-1]\n"
    if @history > 0;  # show latest command if we were able to read the history file

答案 1 :(得分:0)

你见过

吗?
 Term::ReadLine::Gnu

http://search.cpan.org/search?mode=all&query=term+readlin+gnu

在cpan上?

SO有一个

 readline

标记它和其他实现。