이 연결 해제 스크립트 작업은 어떤 조건에서 무엇을 수행합니까?

이 연결 해제 스크립트 작업은 어떤 조건에서 무엇을 수행합니까?

다른 사람의 스크립트를 디버깅하고 있는데 다음과 같은 내용이 혼란스럽습니다.

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

즉, 프로그램을 실행하고 성공하면 삭제합니다.

관련 정보