Chame e execute o script PHP a partir do shell script

5

Estou tentando algo simples, mas não consigo descobrir. Tentando executar um script de shell que chama o script php do diretório do site. Meu shell script é simples test.sh :

#!/bin/sh

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

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

Meu test.php não tem erros e quando o executo diretamente no navegador, ele está funcionando. Novamente script simples como

<?php
  // source code
?>

Quando executo ./test.sh result is

  

./ test.sh: 8:.: Não é possível abrir / usr / bin / php /path/to/my/site/dir/test.php

A linha 8 é . "${CONFIG}${i}/test.php"

Eu também tentei adicionar no início do arquivo PHP esta linha, mas o resultado é o mesmo

#!/usr/bin/php

UPDATE: caminho para php

$ which -a php
/usr/bin/php

Eu também fiz chmod +x test.php

    
por S.I. 20.10.2016 / 07:56

3 respostas

3

O problema aqui é que você está citando o comando entiore que você está tentando executar como uma única variável. Como resultado, você não está executando php com foo.php como argumento, mas está tentando executar um arquivo chamado php foo.php . Veja um exemplo mais simples para mostrar o que quero dizer:

$ 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  

Então, o jeito certo é remover o espaço e citar cada variável separadamente:

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

Se você fizer isso, receberá o próximo erro. O . é o source command . Isso tenta ler um script shell e executá-lo na sessão atual. Você está dando um script PHP em seu lugar. Isso não vai funcionar, você precisa executar , não source .

Por fim, sempre evite usar nomes de variáveis CAPITAL. As variáveis reservadas do shell são capitalizadas, por isso é sempre bom usar nomes de variáveis em minúsculas para seus scripts.

Colocando tudo isso junto (com algumas outras pequenas melhorias), o que você quer é algo como:

#!/bin/sh

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

for i in "$list"
do
    "$config" "$i"/test.php
done
    
por terdon 20.10.2016 / 13:56
4

Trabalhando bem para mim, Exemplo:

$ 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

Acho que o problema no seu código é a linha:

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

Remova o .

    
por Benny 20.10.2016 / 08:52
2

Normalmente, o comando php é usado para interpretação de scripts PHP no shell.

$ php /path/script-name.php

Eu fiz um test.sh simples e funciona:

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

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

Funciona.

Depois disso, fiz um script complicado como seu exemplo:

$ 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

Funciona!

$ 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

Funciona também!

    
por pa4080 20.10.2016 / 08:10