【问题标题】:Perl scripts that has the same function as Unix Command "history"?与 Unix 命令“历史”具有相同功能的 Perl 脚本?
【发布时间】:2011-07-12 07:25:11
【问题描述】:

是否可以编写 Perl 脚本来获取 Unix 命令的历史记录?意思是写一个和 Unix 命令“历史”功能相同的 Perl 脚本?

我尝试使用 tcsh 历史记录,但历史记录不包含最新的 Unix 命令。最新的只有在我关闭当前的 xterm 后才可用。有没有办法在不关闭xterm的情况下解决?

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

谢谢。

【问题讨论】:

  • 这可能有点离题——但你为什么要使用 tcsh?也许像 bash 或 zsh 这样的东西会更好地满足您的需求。另外,作为一个主题,您是否设置了历史变量等?因为我认为 tcsh 有很好的历史支持......

标签: perl unix


【解决方案1】:

您可以通过编辑您的主目录中的.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

【讨论】:

  • 嗨!!!非常感谢您给我如此有用的建议和建议,我真的很感激!我有一个问题,我要做的就是使用 Perl 脚本实现所有内容,而无需在 Unix 中键入任何命令,这意味着可以使用 Perl 脚本中的 ~/.tcshrc 文件来实现这两行不同的语法或任何其他方法。
  • 感谢您的夸奖。如果您尝试获取 shell 历史记录(在本例中为 tcsh),那么您必须通过 shell 激活该历史记录的写入......即它是 shell 的一个功能。如果您询问是否要编写自己的带有历史记录的命令行提示符,那么您可以使用 Term::Readline::Gnu 创建提示符、获取用户输入、保存历史记录、搜索它等。在后一种情况下,您正在编写您自己的 shell 或程序的交互式界面。
  • 让我先花点时间研究一下 Term::Readline::Gnu。那么没有与“history -S”功能相同的 Perl 脚本/语法吗?
  • 或者我的问题的方向是错误的,因为实际上我想做的是“历史| grep关键字”,只是因为如果我想grep多种类型的关键字需要相当多的步骤,所以我希望它是自动化的,我写了一个 Perl 脚本来做所有事情,所以每当我想查看那些特定的命令时,我都会使用 Perl 脚本来为我做。
  • 您提出的问题含糊不清。您是否试图强制外壳保存其历史?或者你正在编写你自己的命令行解释器,你想要它的历史?如果是前者,那就不行,因为这是一个内置的外壳,它会影响外壳本身的内部结构。没有外部历史跟踪。 history -S 是 shell 的内部命令,告诉它保存其历史记录,而不是等到 shell 结束。
【解决方案2】:

你见过

 Term::ReadLine::Gnu

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

在 cpan 上?

所以有一个

 readline

标记它和其他实现。

【讨论】:

    猜你喜欢
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2012-05-26
    相关资源
    最近更新 更多