it-swarm.com.de

Rufen Sie das PHP-Skript über das Shell-Skript auf und führen Sie es aus

Ich versuche etwas Einfaches, kann es aber nicht herausfinden. Versucht, ein Shell-Skript auszuführen, das PHP-Skript aus dem Site-Verzeichnis aufruft. Mein Shell-Skript ist einfach test.sh:

#!/bin/sh

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

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

Mein test.php hat keine Fehler und wenn ich es direkt im Browser starte, funktioniert es. Es mag wieder einfaches Skript

<?php
  // source code
?>

Wenn ich ./test.sh starte, ist das Ergebnis

./test.sh: 8:.: Kann/usr/bin/php /path/to/my/site/dir/test.php nicht öffnen

Zeile 8 ist . "${CONFIG}${i}/test.php"

Ich habe auch versucht, diese Zeile am Anfang der PHP -Datei hinzuzufügen, aber das Ergebnis ist dasselbe

#!/usr/bin/php

UPDATE: Pfad zu PHP

$ which -a php
/usr/bin/php

Ich habe auch chmod +x test.php gemacht

6
S.I.

Das Problem hierbei ist, dass Sie den entiore-Befehl, den Sie ausführen möchten, als einzelne Variable angeben. Infolgedessen führen Sie php nicht mit foo.php als Argument aus, sondern versuchen stattdessen, eine Datei mit dem Namen php foo.php auszuführen. Hier ist ein einfaches Beispiel, um Ihnen zu zeigen, was ich meine:

$ 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  

Der richtige Weg ist also, das Leerzeichen zu entfernen und jede Variable einzeln in Anführungszeichen zu setzen:

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

Wenn Sie das aber tun, werden Sie den nächsten Fehler treffen. Der . ist der source Befehl . Dadurch wird versucht, ein Shell-Skript zu lesen und in der aktuellen Sitzung auszuführen. Sie geben ihm stattdessen ein PHP-Skript. Das wird nicht funktionieren, Sie müssen es ausführen , nicht source es.

Vermeiden Sie schließlich immer die Verwendung von CAPITAL-Variablennamen. Die reservierten Variablen der Shell werden in Großbuchstaben geschrieben. Es empfiehlt sich daher, für Ihre Skripte immer kleingeschriebene Variablennamen zu verwenden.

Wenn Sie dies alles zusammenstellen (mit ein paar kleinen Verbesserungen), ist das, was Sie wollen, so etwas wie:

#!/bin/sh

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

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

Das Problem in Ihrem Code ist die Zeile:

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

Entferne den .


Hier ist ein weiteres Beispiel:

$ 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

Normalerweise wird der Befehl php zur Interpretation von PHP Skripten in der Shell verwendet.

$ php /path/script-name.php

Ich habe einfach test.sh gemacht und es funktioniert:

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

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

Es klappt.

Danach habe ich ein kompliziertes Skript als Beispiel erstellt:

$ 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

Es klappt!

$ 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

Funktioniert auch!

3
pa4080