如何在Perl脚本中调用shell命令?

时间:2010-07-08 05:07:09

标签: perl

如何调用shell命令,在Perl脚本中说“ls -a”以及检索命令输出的方法是什么?

7 个答案:

答案 0 :(得分:62)

How to run a shell script from a Perl program

  

1。使用系统系统($ command,@ arguments);

     

例如:

     

system("sh", "script.sh", "--help" );

     

system("sh script.sh --help");

     

系统将执行$命令   @arguments并在完成后返回脚本。你可以检查$!   对于外部应用程序传递给操作系统的某些错误。读   系统的文档为各种各样的细微差别   调用略有不同。

     

2。使用exec

     

这与使用system非常相似,但它会   执行时终止你的脚本。再次阅读文档   exec获取更多信息。

     

3。使用反引号或qx //

     

my $output = `script.sh --option`;

     

my $output = qx/script.sh --option/;

     

反引号运算符及其等价的qx //执行运算符内的命令和选项   返回该命令在完成时输出到STDOUT。

     

还有   通过创造性地使用open来运行外部应用程序的方法,但是   这是先进的用途;阅读文档了解更多信息。

答案 1 :(得分:13)

Perl HowTo开始,从Perl执行外部命令的最常用方法是:

  • my $files = `ls -la` - 在$files
  • 中捕获命令的输出
  • system "touch ~/foo" - 如果您不想捕获命令的输出
  • exec "vim ~/foo" - 如果您不想在执行命令
  • 后返回脚本
  • open(my $file, '|-', "grep foo"); print $file "foo\nbar" - 如果您想将输入传输到命令

答案 2 :(得分:11)

查看Perl中的open函数 - 尤其是使用“|”的变体(管道)在参数中。正确完成后,您将获得一个可用于读取命令输出的文件句柄。后退操作员也这样做。

您可能还想查看Perl是否可以访问命令本身使用的C函数。例如,对于ls -a,您可以使用opendir函数,然后使用readdir函数读取文件名,最后使用(惊讶){{3}关闭目录功能。这有许多好处 - 精度可能比速度更重要。使用这些函数,即使文件名包含像换行符这样的奇数字符,也可以获得正确的数据。

答案 3 :(得分:11)

实施例

  1. `ls -l`;
  2. system("ls -l");
  3. exec("ls -l");

答案 4 :(得分:8)

随着您对使用Perl越来越有经验,您会发现需要运行shell命令的次数越来越少。例如,获取文件列表的一种方法是使用Perl的内置glob函数。如果您希望列表按排序顺序排列,则可以将其与内置sort函数结合使用。如果您需要有关每个文件的详细信息,可以使用stat功能。这是一个例子:

#!/usr/bin/perl

use strict;
use warnings;

foreach my $file ( sort glob('/home/grant/*') ) {
    my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
        = stat($file);
    printf("%-40s %8u bytes\n", $file, $size);
}

答案 5 :(得分:6)

有很多方法可以从perl脚本调用shell命令,例如:

  1. 回来打勾        ls捕获输出并返回给您。
  2. 系统        系统( 'LS');
  3. 请参阅此处的#17:perl programming tips

答案 6 :(得分:1)

如果您需要双向通信,可能需要查看open2open3