【问题标题】:How can I call a shell command in my Perl script?如何在我的 Perl 脚本中调用 shell 命令?
【发布时间】:2011-03-13 03:54:53
【问题描述】:

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

【问题讨论】:

    标签: perl


    【解决方案1】:

    How to run a shell script from a Perl program

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

    例如:

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

    系统将执行 $command with @arguments 并在完成后返回您的脚本。你可以检查$! 对于外部应用程序传递给操作系统的某些错误。读 系统文档,了解如何变化的细微差别 调用略有不同。

    2。使用exec

    这和system的用法很相似,但是会 在执行时终止您的脚本。再次,阅读文档 exec 了解更多。

    3.使用反引号或qx//

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

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

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

    【讨论】:

    • system() 在运行时给你输出。
    • 我认为 tilda ` 不适用于最新的 perl(5.24.0)
    • 这被称为反引号` ...无论如何编程,当用于外语时它是重音。波浪线(注意末尾的“e”,而不是“a”)是波浪线;在 Perl 中用于模式匹配和智能匹配。
    • 对于 qx/ 或反引号加 2>&1 以捕获 stderr。
    【解决方案2】:

    来自Perl HowTo,从 Perl 执行外部命令的最常见方法是:

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

    【讨论】:

      【解决方案3】:

      示例

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

      【讨论】:

      • 您应该解释这些方法之间的区别。另外,我相信并非所有人都解决了 OP 的问题(调用 exec 不会返回 perl 脚本 AFAIR)
      • @K.L.你是对的,没有一些讨厌的黑客 exec 将退出 perl 脚本,退出代码与传递的命令相同。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        随着您使用 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);
        }
        

        【讨论】:

        • 显然这个答案不适用于ls以外的命令,但是在用户实际要调用ls的情况下,这个答案应该得到认可,因为它回答了用户的意图而不是他们的实际问题。
        【解决方案6】:

        您可以通过多种方式从 Perl 脚本调用 shell 命令,例如:

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

        请参阅此处的 #17:Perl programming tips

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            我一直使用system和qq在perl里面运行linux程序。而且效果很好。

            #!/usr/bin/perl   # A hashbang line in perl
                
            use strict;       # It can save you a lot of time and headache
            use warnings;     # It helps you find typing mistakes
            
            # my keyword in Perl declares the listed variable
            
            my $adduser = '/usr/sbin/adduser';
            my $edquota = '/usr/sbin/edquota';
            my $chage = '/usr/bin/chage';
            my $quota = '/usr/bin/quota';
            my $nomeinteiro;
            my $username;
            my $home;
            
            
            # system() function executes a system shell command
            # qq() can be used in place of double quotes
            
            system qq($adduser --home $home --gecos "$fullname" $username);
            system qq($edquota -p john $username);
            system qq($chage -E \$(date -d +180days +%Y-%m-%d) $username);
            system qq($chage -l $username);
            system qq($quota -s $username);
            
            

            【讨论】:

            • 如果您可以在代码中添加一些解释,答案会更有用。
            • 感谢您的评论。现在我放了更多的 cmets 以获得更好的理解。
            猜你喜欢
            • 2011-01-04
            • 2012-10-17
            • 2014-11-21
            • 1970-01-01
            • 1970-01-01
            • 2012-03-16
            • 2013-06-09
            • 2020-04-30
            • 2017-10-24
            相关资源
            最近更新 更多