이 IF 문이 명령줄에서는 작동하지만 스크립트에서는 작동하지 않는 이유는 무엇입니까?

이 IF 문이 명령줄에서는 작동하지만 스크립트에서는 작동하지 않는 이유는 무엇입니까?

루트로서 명령줄에서 다음을 실행합니다.

if [[ -e /var/log/apache2/error.log ]]; then echo YES; fi
YES

그러나 스크립트에서는 그렇지 않습니다.

if [[ -e /var/log/apache2/error.log ]]; then
    echo YES
fi

왜 이런 일이 발생하는지 아시나요? 예상되는 출력이나 오류가 발생하지 않습니다.

스크립트의 첫 번째 줄은 다음과 같습니다.#!/bin/bash

스크립트가 PHP 스크립트(www-admin)에 의해 호출되기 때문에 파일 권한 때문일 수 있다고 생각했지만 error.log 파일에는 읽기 권한이 있습니다.

-rw-r--r-- 1 root adm 1763810 Sep 17 09:02 /var/log/apache2/error.log

상위 폴더 권한

drwxr-xr-x  10 root root  4096 Mar 20  2019 var
drwxr-xr-x 5 root root 12288 Sep 17 06:25 log
drwxr-xr-x 2 root root       4096 Sep 17 06:25 apache2

PHP 스크립트는 bash 스크립트를 어떻게 호출합니까?

$cmd = "sh myscript.sh";
$output = array();
$output = shell_exec($cmd);

IF 문 없이도 스크립트가 제대로 실행됩니다.

답변1

bash 스크립트 호출을 사용하고 있습니다 sh. 이것은 일반적으로 기본 POSIX 셸입니다 dash. 예를 들어 이것은 [[POSIX가 아니며 bashism(다른 셸에도 있음)이므로 sh지원하지 않습니다.

$ dash -c "if [[ 10 -gt 8 ]]; then echo yeah; fi"
dash: 1: [[: not found

따라서 표준을 사용하도록 스크립트를 변경하십시오 [(어쨌든 특별한 기능을 사용하지 않습니다 [[).

if [ -e /var/log/apache2/error.log ]; then
    echo YES
fi

또는 PHP 스크립트를 변경하고 bash를 사용하여 명시적으로 호출합니다.

$cmd = "bash myscript.sh";

또는 shebang이 있고 #!/bin/bash스크립트에 실행 가능한 비트가 설정되어 있다고 가정하고 직접 호출하면 됩니다.

$cmd = "./myscript.sh";

관련 정보