2011-07-08 176 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)。

相關問題