首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于perl backticks的尾命令。

用于perl backticks的尾命令。
EN

Stack Overflow用户
提问于 2015-03-25 21:39:21
回答 3查看 1.7K关注 0票数 2

我试图使用通常的backticks从perl脚本中运行tail命令。

我的perl脚本中的部分如下:

代码语言:javascript
复制
$nexusTime += nexusUploadTime(`tail $log -n 5`);

因此,我正在尝试获取该文件的最后5行,但是当perl脚本完成时,我会得到以下错误:

代码语言:javascript
复制
sh: line 1: -n: command not found

尽管当我在命令行上运行命令时,它确实是成功的,我可以从这个特定的位置看到这5行。

不知道这是怎么回事。为什么它在命令行中工作,但是通过perl它不会识别-n选项。

有人有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-25 22:03:24

$log有一个额外的尾随换行符,所以您要执行

代码语言:javascript
复制
tail file.log
 -n 5            # Tries to execute a program named "-n"

修正:

代码语言:javascript
复制
chomp($log);

注意,如果log $log包含shell元字符(例如空格),则会遇到问题。修正:

代码语言:javascript
复制
use String::ShellQuote qw( shell_quote );

my $tail_cmd = shell_quote('tail', '-n', '5', '--', $log);
$nexusTime += nexusUploadTime(`$tail_cmd`);
票数 6
EN

Stack Overflow用户

发布于 2015-03-25 22:11:34

ikegami pointed out您的错误,但我建议尽量避免外部命令。它们是不可移植的,调试它们可能是一件痛苦的事情。您可以使用以下纯Perl代码模拟tail

代码语言:javascript
复制
use strict;
use warnings;

use File::ReadBackwards;

sub tail {
    my ($file, $num_lines) = @_;

    my $bw = File::ReadBackwards->new($file) or die "Can't read '$file': $!";

    my ($lines, $count);
    while (defined(my $line = $bw->readline) && $num_lines > $count++) {
        $lines .= $line;
    }

    $bw->close;

    return $lines;
}

print tail('/usr/share/dict/words', 5);

输出

代码语言:javascript
复制
ZZZ
zZt
Zz
ZZ
zyzzyvas

请注意,如果您传递包含换行符的文件名,这将失败

代码语言:javascript
复制
Can't read 'foo
': No such file or directory at tail.pl line 10.

而不是更神秘的

代码语言:javascript
复制
sh: line 1: -n: command not found

在后台运行tail实用程序所得到的结果。

票数 3
EN

Stack Overflow用户

发布于 2015-03-25 21:49:50

这个问题的答案是将选项-n 5放在目标文件之前。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29267050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档