有没有办法在perl脚本中使用more
命令?有一个文件,我想打印其内容,但由于有很多行,我想用more
打印它。我尝试将more
放入反引号中,但它不起作用:
open(FILE,'/opt/myfile' ) or die("Could not open file.");
`more /opt/myfile`;
答案 0 :(得分:6)
`more /opt/myfile`
表示将more
命令的输出捕获到一个字符串中,该字符串被丢弃(您通常将输出存储在变量中或将其传递给函数)。当其输出未连接到终端时,more
相当于cat
,它没有做任何有用的事情。
要在Perl中运行子进程而不捕获其输出,请使用system
函数。
system('more', '/opt/myfile');
请注意,您应该传递包含命令及其参数的列表,而不仅仅是字符串。如果将单个字符串传递给system
,则会将其传递给shell,后者将展开文件名中的任何特殊字符。例如,system('more /opt/myfile')
可以使用,但system('more /opt/$(rm -rf ~)')
会删除所有文件。如果传递多个参数,则不涉及shell:system('more', '/opt/$(rm -rf ~)')
在该奇怪命名的文件上调用more
。
如果存在文件名以+
或-
开头的风险,请在文件名前面传递--
,以避免将其解释为选项。
您应该检查more
环境变量,而不是调用PAGER
,如果已定义,则调用它。 $PAGER
是事实上的标准寻呼机。如果未定义变量,则在此千禧年,您应该默认为less
(如果您是偏执狂,默认为less
如果它存在,则more
否则)。
my $pager = $ENV{PAGER};
if (!defined $pager || $pager eq '') {
$pager = 'less';
}
system($pager, '--', '/opt/myfile');
答案 1 :(得分:4)
只需使用系统命令:
system('more thefile');
答案 2 :(得分: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;'