perl中的系统命令

时间:2012-12-26 10:20:03

标签: perl bash

我需要运行一个系统命令,该命令将转到目录并删除不包含文件的子目录(如果存在)。我编写了以下命令来执行此操作:

system("cd /home/faizan/test/cache ; for i in *\; do if [ -d \"$i\" ]\; then echo \$i fi done");

上面的命令不断引发语法错误。我尝试了多种组合,但仍然不清楚这应该如何。请建议。

4 个答案:

答案 0 :(得分:6)

好吧,您的命令行确实包含语法错误。试试这个:

system("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done");

或者更好的是,首先只覆盖目录;

system("for i in /home/faizan/test/cache/*/.; do echo \$i; done");

或者更好的是,没有循环就可以做到:

system("echo /home/faizan/test/cache/*/.");

(我认为一旦正确调试,您将需要rmdir而不是echo。)

或者更好的是,在Perl中完成所有工作。这里没有任何内容需要system()

答案 1 :(得分:1)

由于问题标题代表system命令,这将直接回答,但使用bash的示例命令仅包含仅在perl中更简单的内容(使用opendir查看其他答案, perl中的-d

如果您想使用system(而不是open $cmdHandle,"bash -c ... |"),systemexec等执行命令的首选语法是让perl解析命令行。

试试这个(就像你已经做过的那样):

perl -e 'system("bash -c \"echo hello world\"")'
hello world

perl -e 'system "bash -c \"echo hello world\"";'
hello world

现在更好,同样让perl确保命令行解析,试试这个:

perl -e 'system "bash","-c","echo hello world";'
hello world

system命令显然有3个参数:

  1. 的bash
  2. -c
  3. 脚本
  4. 或更多:

    perl -e 'system "bash","-c","echo hello world;date +\"Now it is %T\";";'
    hello world
    Now it is 11:43:44
    

    正如您在上一个目的中所看到的,没有双双引号包含 bash脚本命令行的一部分。

    ** Nota:在命令行中,使用perl -e '...'perl -e "...",使用引号和双引号有点重。在脚本中,您可以混合它们:

    system 'bash','-c','for ((i=10;i--;));do printf "Number: %2d\n" $i;done';
    

    甚至:

    system 'bash','-c','for ((i=10;i--;));do'."\n".
                           'printf "Number: %2d\n" $i'."\n".
                           'done';
    

    使用点.用于连接(脚本部分)字符串的一部分,总有3个参数。

答案 2 :(得分:1)

你最好先尝试使用bash命令。正确格式化可以更清楚地表明您缺少语句终止符:

for i in *; do
    if [ -d "$i" ]; then
        echo $i
    fi
done

通过用分号替换新行来缩小(除了do / then之后):

for i in *; do if [ -d "$i" ]; then echo $i; fi; done

或者如前所述,只需在Perl中进行(我没有测试过这个实际上没有注释remove_tree的地方 - 小心!):

use strict;
use warnings;

use File::Path 'remove_tree';
use feature 'say';

chdir '/tmp';
opendir my $cache, '.';
while (my $item = readdir($cache)) {
    if ($item !~ /^\.\.?$/ && -d $item) {
        say "Deleting '$item'...";
        # remove_tree($item);
    }
}

答案 3 :(得分:1)

使用系统

my @args = ("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done");
system(@args);

使用子程序

sub do_stuff {
  my @args = ( "bash", "-c", shift );
  system(@args);
}

do_stuff("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done");