perl反引号中使用的尾部命令

sSm*_*cKk 2 unix perl command backticks

我正在尝试使用通常的反引号在perl脚本中运行tail命令.

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

$nexusTime += nexusUploadTime(`tail $log -n 5`);
Run Code Online (Sandbox Code Playgroud)

所以我试图获取此文件的最后5行,但是当perl脚本完成时我收到以下错误:

sh: line 1: -n: command not found
Run Code Online (Sandbox Code Playgroud)

即使我在命令行上运行命令它确实成功,我可以看到该特定的5行.

不知道这里发生了什么.为什么它从命令行工作,但通过perl它将无法识别-n选项.

有人有什么建议吗?

ike*_*ami 5

$log 有一个无关的尾随换行符,所以你正在执行

tail file.log
 -n 5            # Tries to execute a program named "-n"
Run Code Online (Sandbox Code Playgroud)

固定:

chomp($log);
Run Code Online (Sandbox Code Playgroud)

请注意,如果日志$log包含shell元字符(例如空格),则会遇到问题.固定:

use String::ShellQuote qw( shell_quote );

my $tail_cmd = shell_quote('tail', '-n', '5', '--', $log);
$nexusTime += nexusUploadTime(`$tail_cmd`);
Run Code Online (Sandbox Code Playgroud)