Search code examples
perlunixcommandbackticks

Tail command used in perl backticks


I'm trying to run a tail command from within a perl script using the usual backticks.

The section in my perl script is as follows:

$nexusTime += nexusUploadTime(`tail $log -n 5`);

So I'm trying to get the last 5 lines of this file but I'm getting the following error when the perl script finishes:

sh: line 1: -n: command not found

Even though when I run the command on the command line it is indeed successful and I can see the 5 lines from that particular.

Not sure what is going on here. Why it works from command line but through perl it won't recognize the -n option.

Anybody have any suggestions?


Solution

  • $log has an extraneous trailing newline, so you are executing

    tail file.log
     -n 5            # Tries to execute a program named "-n"
    

    Fix:

    chomp($log);
    

    Note that you will run into problems if log $log contains shell meta characters (such as spaces). Fix:

    use String::ShellQuote qw( shell_quote );
    
    my $tail_cmd = shell_quote('tail', '-n', '5', '--', $log);
    $nexusTime += nexusUploadTime(`$tail_cmd`);