Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl脚本中调用shell命令?_Perl - Fatal编程技术网

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

如何在Perl脚本中调用shell命令?,perl,Perl,如何调用shell命令,例如Perl脚本中的'ls-a',以及如何检索命令输出的示例是什么? 1。使用系统system($command,@arguments) 例如: system("sh", "script.sh", "--help" ); system("sh script.sh --help"); 系统将使用 @参数,并在完成后返回脚本。你可以查美元! 对于外部应用程序传递给操作系统的某些错误。阅读 该文件为系统提供了各种不同的细微差别 调用略有不同 2。使用exec my $out

如何调用shell命令,例如Perl脚本中的'
ls-a
',以及如何检索命令输出的示例是什么?

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

例如:

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

system("sh script.sh --help");
系统将使用 @参数,并在完成后返回脚本。你可以查美元! 对于外部应用程序传递给操作系统的某些错误。阅读 该文件为系统提供了各种不同的细微差别 调用略有不同

2。使用
exec

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

my $output = qx/script.sh --option/;
这与的使用非常相似,但它将 执行时终止脚本。再次阅读文档 为了更多

3。使用反勾号或
qx/

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

my $output = qx/script.sh --option/;
backtick操作符及其等价的
qx/
,在操作符内部执行命令和选项,并在完成时将命令输出返回到STDOUT

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

看看Perl中的函数——特别是在参数中使用“|”(管道)的变体。如果操作正确,您将获得一个文件句柄,可用于读取命令的输出。反向勾选操作符也会这样做


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

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

  • 背虱
    ls
    捕获输出并返回给您
  • 系统 系统('ls')
  • 打开
  • 请参阅此处的#17:

    示例
  • `ls-l`
  • 系统(“ls-l”)
  • exec(“ls-l”)

  • 如果需要双向通信,您可能需要深入研究。随着您使用Perl的经验越来越丰富,您会发现需要运行shell命令的情况越来越少。例如,获取文件列表的一种方法是使用Perl的内置函数。如果希望列表按排序顺序排列,可以将其与内置函数结合使用。如果需要每个文件的详细信息,可以使用该函数。下面是一个例子:

    #!/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);
    }
    
    从中,从Perl执行外部命令的最常见方法是:

    • my$files=`ls-la`
      -捕获
      $files
    • 系统“touch~/foo”
      -如果不想捕获命令的输出
    • exec“vim~/foo”
      -如果执行命令后不想返回脚本
    • open(我的$file,“|-”,“grep foo”);打印$file“foo\nbar”
      -如果要将输入导入命令

    链接可能会断开,然后您的答案将一文不值。你应该引用你链接到的文本中最重要的部分,这样即使链接被破坏,答案也是有效的。我引用了链接的相关部分。感谢您指出.system()在运行时提供了u输出。我认为tilda`不适用于最新的perl(5.24.0),即所谓的backtick`。。。不管怎么说,当在外语中使用时,它是一种口音。波浪线(注意末尾的“e”而不是“A”)是弯曲的线条;在Perl中用于模式匹配和智能匹配。您应该解释这些方法之间的区别。另外,我相信并不是所有的方法都能解决OP的问题(调用exec不会返回到perl脚本AFAIR)@K.L。你是对的,如果没有一些讨厌的黑客攻击,exec将使用与传递的命令相同的退出代码退出perl脚本。显然,这个答案不适用于除
    ls
    以外的命令,但是,如果用户实际上要呼叫
    ls
    ,那么这个答案应该得到认可,因为它回答了用户的意图,而不是他们的实际问题。