2011-07-08 100 views
1

由于我还是Unix和Perl的新手,我正在寻找一种简单而直接的方法来获取我使用Perl脚本运行的Unix命令。如何获取我使用Perl脚本运行的Unix命令?

我所知道的是“历史”可以追溯我运行的命令,但它不能在Perl中使用back ticks history来运行它。

我试图把vi文本编辑器中的“history> filename”放在一个临时文件中,使用命令“source”它,它起作用,但是命令“source”也不能在Perl脚本中使用反标记。

任何人都可以指导我解决我的问题吗?指导我正确的方法来解决我的问题? T.T

谢谢。

回答

4

你不行。壳(好吧,bash和tcsh,无论如何,你的shell可能会,但可能不会变化)仅以交互模式保存命令历史记录。通过perl脚本在子shell中运行的命令不会被添加到历史文件中。

+0

有很多通过CPAN可用的新增功能。没有一个是相关的(包括对cpan> shell的readline支持),而perl shell(psh)在这里也没有关系..但是总有一天我们会看到完全集成的perl shell。 –

0

这将得到由在交互模式下的用户身份运行命令的历史记录:

$data_file = "~/.bash_history"; 
open(DAT, $data_file) || die("Could not open file!"); 
@fileData = <DAT>; 
close(DAT); 
foreach $command (@fileData) { 
    # Do things here. 
} 

正如摆提到的,虽然,这历史文件将不包含命令从Perl脚本运行 - 你”必须让脚本在运行时将该命令附加到文件中,从而创建它自己的历史文件(或者将它附加到~/.bash_history,这将使它与交互式shell共享历史文件)。

+0

我明白了。现在,如果我想编写一个Perl脚本来获取Unix命令的历史记录呢?这意味着编写一个与Unix命令“history”具有相同功能的Perl脚本? – keifer

+0

我试图使用tcsh历史记录,但历史记录不包含最新的Unix命令。最新版本只有在关闭当前xterm后才可用。 – keifer

0

如果你有机会到perl脚本(也就是,你可以改变它),你可以简单地在perl脚本的每个命令运行写一个选择的文本文件:

sub run_program 
{ 
    my $program = shift; 
    open PROGS, ">>my-commands.txt", or die $!; 
    print PROGS $program."\n"; 
    `$program`; 
    close(PROGS); 
} 

然后只需运行`每当你希望在脚本中运行一个命令时,run_program($ command)。

相关问题