web-dev-qa-db-ja.com

シェルスクリプトからphpスクリプトを呼び出して実行する

私は簡単なことを試みていますが、それを理解できません。サイトディレクトリからphpスクリプトを呼び出す1つのシェルスクリプトを実行しようとしています。私のシェルスクリプトは簡単ですtest.sh

#!/bin/sh

LIST="/path/to/my/site/dir"
CONFIG="/usr/bin/php "

for i in $LIST
do
    . "${CONFIG}${i}/test.php"        
done

私のtest.phpにはエラーがなく、ブラウザで直接実行すると動作します。再び簡単なスクリプトのように

<?php
  // source code
?>

./test.shを実行すると、結果は

./test.sh:8:。:/ usr/bin/php /path/to/my/site/dir/test.phpを開けません

行8は. "${CONFIG}${i}/test.php"です

PHPファイルの先頭にもこの行を追加しようとしましたが、結果は同じです

#!/usr/bin/php

更新:phpへのパス

$ which -a php
/usr/bin/php

chmod +x test.phpも作成しました

6
S.I.

ここでの問題は、単一の変数として実行しようとしているentioreコマンドを引用していることです。その結果、foo.phpを引数としてphpを実行せず、代わりにphp foo.phpというファイルを実行しようとしています。ここに、私が何を意味するかを示す簡単な例を示します。

$ var1="echo "
$ var2="foo"
$ set -x ## debugging info
$ "$var1$var2"
+ 'echo foo'      ### The Shell tries to execute both vars as a single command
bash: echo foo: command not found

$ "$var1" "$var2"
+ 'echo ' foo     ### The Shell tries to execute 'echo ' (echo with a space)
bash: echo foo: command not found  

そのため、正しい方法はスペースを削除して各変数を個別に引用することです。

$ var1="echo"
$ var2="foo"
$ "$var1" "$var2"

ただし、それを行うと、次のエラーが発生します。 .sourceコマンド です。これは、Shellスクリプトを読み取って、現在のセッションで実行しようとします。代わりにphpスクリプトを提供しています。それは動作しません、あなたはexecuteそれではなく、sourceを実行する必要がありますそれ。

最後に、CAPITAL変数名の使用は常に避けてください。シェルの予約変数は大文字であるため、スクリプトには常に小文字の変数名を使用することをお勧めします。

これらすべてを(他のいくつかのマイナーな改良を加えて)まとめると、あなたが望むものは次のようなものになります:

#!/bin/sh

list="/path/to/my/site/dir"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/test.php
done
3
terdon

コードの問題は次の行です。

. "${CONFIG}${i}/test.php"  

.を削除します


別の例を次に示します。

$ ls -l

-rwxrwxr-x 1 bg bg 67 Oct 20 09:42 index.php
-rwxrwxr-x 1 bg bg 68 Oct 20 09:43 test.sh

index.php

<?php
    Shell_exec('echo Hello > /tmp/hello.txt');
?>

test.sh

#!/bin/bash
/usr/bin/php index.php
4
Benny

通常、コマンドphpは、シェルのPHPスクリプトの解釈に使用されます。

$ php /path/script-name.php

私は簡単なtest.shを作成し、それは動作します:

$ cat ./text.sh
#!/bin/bash
Sudo php /var/www/wiki/maintenance/update.php

$ chmod +x ./test.sh
$ ./test.sh

できます。

その後、例として複雑なスクリプトを作成しました。

$ cat ./text.sh

#!/bin/sh

LIST=/var/www/wiki/maintenance
CONFIG=/usr/bin/php

for i in $LIST
do
    ${CONFIG} ${i}/update.php
done

$ Sudo ./test.sh

できます!

$ cat ./text.sh

#!/bin/sh

LIST="/var/www/wiki/maintenance"
CONFIG="/usr/bin/php "

for i in $LIST
do
    ${CONFIG}${i}/update.php
done

$ Sudo ./test.sh

また動作します!

3
pa4080