从键盘文件描述符中读取

时间:2013-08-07 07:29:35

标签: linux perl bash shell stdin

我试图从/dev/fd/0

中的STDIN文件描述符中读取

这就是我写的,我只想打印我在命令shell上输入的每个命令。我用Perl写了这个,但还不够好:

#!/usr/bin/perl

use strict;
use warnings;

open my $fh, "<", "/dev/fd/0" or die "bububububu";
while (<$fh>) {
print $_."\n";
}
close $fh;

因此它虽然卡住了但它不会打印任何东西。有谁知道怎么做??? 如果这不可能,我可以将所有命令放在一个文件中,然后以某种方式从'0'文件句柄中读取它们。我只想捕获进入系统的每个命令。

示例文件:

#!/usr/bin/perl

use strict;
use warnings;

system("./.file2");

然后file2是:

echo this is hard!!!

所以我希望我的程序运行第一个文件。当我读取'0'文件句柄时,我希望以某种方式存储在数组中运行的所有行。

主要编辑:我认为你错过了我。我知道STDIN和它的工作原理。事情是我不想要书写从STDIN读取输入。我希望这篇文章可以从我在SHELL PROMPT中输入的内容中阅读。所以说我运行文件,然后我打开另一个TEMINAL,然后我在终端输入命令。我希望这篇文章能够识别出这些线索并在阵列中保存它们。

2 个答案:

答案 0 :(得分:2)

禁止,我不认为你想做的事情会奏效。 /dev/fd/0句柄对于每个进程都是不同的(当你打开它时,你基本上复制/复制了父进程继承的fh),所以你在perl中打开的文件句柄不会是和你的bash一样。

我相信你在这里有(至少)两种选择:

  1. 使用while( <STDIN> )方法读取命令,然后将它们存储到您的文件中并将它们传递给system()$qx()以由shell执行,但是,因为这会启动一个shell对于每个命令,这仅适用于简单的应用程序。您可以通过在子子中打开shell并将其STDIN / STDOUT文件句柄与perl文件句柄连接来解决此问题,但是您可以管理新命令并读取其输入。有关详细信息,请参阅perldoc perlopentut(管道打开部分)和/或IPC::Open2http://search.cpan.org/~rjbs/perl-5.18.0/ext/IPC-Open3/lib/IPC/Open2.pm)。结合Term::ReadLine,您可以模拟shell的完整输入方法,并且在记录所有命令时不会发现太多差异。
  2. 您是否有任何理由不仅使用 bash的历史记录功能(请参阅此处:http://www.talug.org/events/20030709/cmdline_history.html)。默认情况下,您在交互式会话中执行的每个命令都应记录在~/.bash_history中,您可以使用`history。
  3. 来访问它。

    如果您的应用程序与安全性相关,并且您尝试记录系统上root所执行的所有内容,那么您可能还需要查看sudo

    希望这可以帮到你,  基督教

答案 1 :(得分:0)

有一个特殊的Perl文件描述符与标准输入相关联。您可以将代码重写为:

use strict;
use warnings;

while( <STDIN> ) {
   print;
   last if /^QUIT/;  #Exit loop if QUIT was typed
}

#<-- Note: no open neither close