この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";

おすすめ記事