这个取消链接脚本操作在做什么以及在什么条件下进行?

这个取消链接脚本操作在做什么以及在什么条件下进行?

我正在调试别人的脚本,对此感到困惑:

my $LOG = "/var/log/installfoo.log";
my $APPDIR = "/usr/share/foodir"
my $RUN_ONCE = "$APPDIR/runonce";

# check for script
if (-x $RUN_ONCE) {

    unlink("$RUN_ONCE") unless system("$RUN_ONCE >>$LOG 2>&1");

}

我认为它正在检查文件是否存在,然后如果满足特定条件则删除(并删除任何符号链接)......但我不知道unless system("$RUN_ONCE >>$LOG 2>&1")在做什么。

  • 检查 /usr/share/foodir/runonce 是否存在。
  • 执行该命令(如果存在)(并将输出写入日志文件),然后删除/取消链接该文件。

但我很困惑 - 是否存在文件会保留的条件?这条线的状况unless让我很困惑。

答案1

这不是 shell 脚本,而是 perl。通过查看脚本的第一行,您应该能够看到这一点,这可能类似于

#!/usr/bin/perl

unless动词相当于 an if not。它perl可以放置在语句开头的“传统”位置,也可以放置在它所适用的comaand 的末尾。

例如,这些语句都是等效的:

$a = 31 unless $b == 4;
unless ($b == 4) { $a = 31 }
if ($b != 4) { $a = 31 }

回到你的脚本,

if (-x $RUN_ONCE) {
    unlink("$RUN_ONCE") unless system("$RUN_ONCE >>$LOG 2>&1");
}

这句话的意思大致相当于:

if $RUN_ONCE is executable then
    delete it UNLESS running it returned an error exit status

换句话说,运行该程序,如果运行成功则将其删除。

相关内容