다른 사람의 스크립트를 디버깅하고 있는데 다음과 같은 내용이 혼란스럽습니다.
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
즉, 프로그램을 실행하고 성공하면 삭제합니다.