2

有没有办法more在 perl 脚本中使用该命令?有一个文件,我想打印它的内容,但由于有很多行,我想用more. 我尝试more输入反引号,但它没有用:

open(FILE,'/opt/myfile' ) or die("Could not open  file.");
`more /opt/myfile`;
4

3 回答 3

6

`more /opt/myfile`意味着将命令的输出捕获more到一个字符串中,该字符串被丢弃(您通常将输出存储在变量中或将其传递给函数)。当它的输出没有连接到终端时,more相当于cat,它没有做任何有用的事情。

要在 Perl 中运行子进程而不捕获其输出,请使用该system函数。

system('more', '/opt/myfile');

请注意,您应该传递一个包含命令及其参数的列表,而不仅仅是一个字符串。如果您将单个字符串传递给system,它将被传递给 shell,该 shell 将扩展文件名中的任何特殊字符。例如,system('more /opt/myfile')可以工作,但system('more /opt/$(rm -rf ~)')会删除您的所有文件。如果您传递多个参数,则不涉及 shell:system('more', '/opt/$(rm -rf ~)')调用more那个奇怪命名的文件。

+如果文件名以or开头存在任何风险,请在文件名之前-传递--,以避免将其解释为选项。

而不是 call more,您应该检查PAGER环境变量,如果已定义,则调用它。$PAGER是事实上的标准寻呼机。如果变量未定义,在这个千年中,您应该默认为less(如果您偏执,则默认为less如果它存在,more否则默认为)。

my $pager = $ENV{PAGER};
if (!defined $pager || $pager eq '') {
    $pager = 'less';
}
system($pager, '--', '/opt/myfile');
于 2012-07-25T00:16:43.423 回答
4

只需使用系统命令:

system('more thefile');
于 2012-07-24T09:17:57.587 回答
0

我可能会打开一个通往寻呼机的管道,如下所示:

open(FILE, "/opt/myfile") or die("Could not open file.");
open(PIPE, "| more") or die("Could not open pipe"); 

while(<FILE>) {
  print PIPE;
}

close P;    
close FILE;'
于 2012-07-24T09:25:23.503 回答