我正在调试别人的脚本,对此感到困惑:
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
换句话说,运行该程序,如果运行成功则将其删除。