【问题标题】:Perl removing the files using system command returns success alwaysPerl 使用系统命令删除文件总是返回成功
【发布时间】:2020-11-27 12:14:09
【问题描述】:

我有一个脚本,它将文件名(及其完整路径)作为参数并将它们从系统中删除。

代码如下:

#!/usr/bin/perl

use strict; use warnings;

warn "No arguments/files names passed to the script: $!\n" unless @ARGV;

my $count = 0;

foreach (@ARGV) {
    my $cmd = "rm -rf $_";
    
    my $exit_code = system($cmd); 
    
    if($exit_code != 0){
        print "Command $cmd failed with an exit code of $exit_code.\n";
        exit($exit_code >> 8);
    } else {
        print "Command $cmd successful!\n";
        $count++;
    }
}

print "Out of ".scalar(@ARGV)." file(s) ".$count." file(s) deleted\n";

我有两个问题:

  1. 在这里,如果我通过虚拟文件说该文件不存在,它会给我$exit_code 作为0。怎么可能?不应该通过0以外的退出代码吗?
  2. 当我以 Perl 方式 unlink $_; 删除文件时,它不会删除它们。如何使用unlink 命令强制删除?

【问题讨论】:

  • 退出代码为 0 表示系统调用成功。 perls unlink 将删除文件,只要您有权删除它们。您需要确保您拥有文件的绝对路径或来自调用脚本的 dir 的相对路径。
  • rm -f :忽略不存在的文件和参数,从不提示。这就是 rm 返回 0 的原因,您使用的是 -f 选项。您可以在删除文件之前检查文件是否存在
  • @BryanK 实际上创建文件的用户正在使用绝对路径删除这些文件。我相信在这里我不会遇到任何许可问题。但问题是为什么 unlink 不能像 rm 一样工作?
  • unlink 当然会删除文件。如果没有,那是因为文件权限或者锁,那么你可以查看unlink的返回码。显示用于不成功的unlink 尝试的代码。
  • @TLP unlink 可以强制删除文件吗?

标签: perl


【解决方案1】:

在这里,如果我通过虚拟文件说文件不存在,它 给我 $exit_code 为 0。这怎么可能?难道不应该通过 0以外的退出码?

您正在使用带有 -f 选项的 rm。来自 rm 的手册页:

-f, --force
              ignore nonexistent files and arguments, never prompt

据我所知,使用此选项时,您在尝试删除不存在的文件时总是会收到0 的返回码。

当我以 Perl 方式删除文件时,取消链接 $_;它不会删除它们。 如何使用 unlink 命令强制删除?

文件无法删除的原因有很多。如果它已设置为不可变,则在包含文件的目录上设置粘性位(并且您不是文件的所有者),或者只是运行脚本的用户没有文件的写权限。关键是与取消链接无关。在使用任何方法(无论是 rm 还是 unlink 等)删除文件之前,您必须拥有适当的权限。

【讨论】:

  • Re "或者只是运行您的脚本的用户没有文件的写权限",您不需要对该文件的写权限来删除它;您需要对其所在目录的写入权限。至少在unix系统上。 (unlink 已经像使用了-f 一样工作,因为-f 绕过了rm 的自我限制。)
【解决方案2】:

我喜欢使用File::Path 中的rmtree。完全不需要为了递归删除而掏腰包。

作为BryanK already answered0 是带有-f 选项的预期错误代码。当您遇到这些问题时,请在 shell 中测试命令以查看它是 Perl(或其他)还是命令。命令的退出值显示在$?(shell 版本,这就是 Perl 的变量具有相同名称的原因):

$ rm -rf test_dir
$ echo $?
0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2017-11-17
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多