この接続解除スクリプト操作はどのような条件で何をしますか?

この接続解除スクリプト操作はどのような条件で何をしますか?

他の人のスクリプトをデバッグしていますが、次の内容が混乱しています。

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

これはシェルスクリプトではなく、Perlです。次のスクリプトの最初の行を見ると、これを確認できます。

#!/usr/bin/perl

このunless動詞はと同じですif not。これはperl、陳述の始まり、またはそれが適用される昏睡状態の終わりに「伝統的な」場所に置くことができます。

たとえば、次の文は同じです。

$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

つまり、プログラムを実行し、成功すると削除します。

関連情報