How can Perl's system() print the command that it's running?

I don't know of any default way to do this, but you can define a subroutine to do it for you:

sub execute {
    my $cmd = shift;
    print "$cmd\n";
    system($cmd);
}

my $cmd = $ARGV[0];
execute($cmd);

And then see it in action:

pbook:~/foo rudd$ perl foo.pl ls
ls
file1   file2   foo.pl

As I understand, system() will print the result of the command, but not assign it. Eg.

[daniel@tux /]$ perl -e '$ls = system("ls"); print "Result: $ls\n"'
bin   dev  home  lost+found  misc  net  proc  sbin     srv  System  tools  var
boot  etc  lib   media       mnt   opt  root  selinux  sys  tmp     usr
Result: 0

Backticks will capture the output of the command and not print it:

[daniel@tux /]$ perl -e '$ls = `ls`; print "Result: $ls\n"'
Result: bin
boot
dev
etc
home
lib

etc...

Update: If you want to print the name of the command being system() 'd as well, I think Rudd's approach is good. Repeated here for consolidation:

sub execute {
    my $cmd = shift;
    print "$cmd\n";
    system($cmd);
}

my $cmd = $ARGV[0];
execute($cmd);

Use open instead. Then you can capture the output of the command.

open(LS,"|ls");
print LS;

Tags:

Perl

System