我需要运行一个系统命令,该命令将转到目录并删除不包含文件的子目录(如果存在)。我编写了以下命令来执行此操作:
system("cd /home/faizan/test/cache ; for i in *\; do if [ -d \"$i\" ]\; then echo \$i fi done");
上面的命令不断引发语法错误。我尝试了多种组合,但仍然不清楚这应该如何。请建议。
答案 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 ... |"
),system
或exec
等执行命令的首选语法是让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个参数:
或更多:
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");