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

Yan*_*ang 50 perl

任何人都可以举例说明我如何调用shell命令,ls -a在Perl脚本中说' '以及检索命令输出的方式.

fir*_*gle 71

如何从Perl程序运行shell脚本

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

例如:

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

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

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

2.使用exec

这与使用系统非常相似,但它会在执行时终止您的脚本.再次,阅读exec的文档以获取更多信息.

3.使用反引号或qx //

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

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

反引号运算符和等效的qx //执行运算符内的命令和选项,并在完成后将命令输出返回到STDOUT.

还有一些方法可以通过创造性地使用open来运行外部应用程序,但这是高级用法; 阅读文档了解更多信息.

  • 链接可能会中断,然后你的回答将毫无价值.您应该引用链接到的文本中最重要的部分,以便即使链接被破坏,答案也是有效的. (7认同)
  • 这被称为反引号`...无论如何编程,当在外语中使用时它是一种口音.波浪线(最后注意"e",而不是"a")是波浪线; 在Perl中用于模式匹配和智能匹配. (3认同)
  • 哦,愚蠢的年轻我.我引用了链接的相关部分.感谢您指出了这一点. (2认同)

sjy*_*sjy 16

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

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


小智 12

例子

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

  • 您应该解释这些方法之间的区别.另外,我相信并非所有这些都解决了OP的问题(调用exec不会返回到perl脚本AFAIR) (5认同)

Jon*_*ler 11

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

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


Gra*_*ean 8

随着您使用Perl的经验越来越丰富,您会发现需要运行shell命令的次数越来越少.例如,获取文件列表的一种方法是使用Perl的内置glob函数.如果您希望按排序顺序列表,则可以将其与内置排序功能结合使用.如果需要有关每个文件的详细信息,可以使用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);
}
Run Code Online (Sandbox Code Playgroud)


the*_*eek 6

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

  1. 返回勾选 ls捕获输出并返回给您.
  2. 系统系统('ls');
  3. 打开

请参考#17:perl编程技巧