Как передать аргументы скрипту, вызываемому источником в php exe c? - PullRequest
0 голосов
/ 04 августа 2020

имеет тестовый сценарий php, который вызывает сценарий bash, как показано ниже. Существует две версии exportImportCommand: активная, которая вызывает скрипт, и комментируемая, которая его использует.

<?php
    $exportImportCommand = __DIR__ . "/test.sh -aroot -bpsswd1 -cPROJECT1 -lhost1.local -eadmin -fpswsd2  -gPROJECT1 -hhost2.local -i'';";
    //$exportImportCommand = ". " . __DIR__ . "/test.sh -aroot -bpsswd1 -cPROJECT1 -lhost1.local -eadmin -fpswsd2  -gPROJECT1 -hhost2.local -i'';";
    printf("Running command:\n %s\n", $exportImportCommand);
    exec ($exportImportCommand, $shellOutput);
    var_dump($shellOutput);  
?>

Вызываемый им скрипт bash выглядит следующим образом:

#!/bin/bash -x

printf 'Number of parameters passed:' "$#"

printf 'Parameters passed:' "$@"

## GET PARAMETERS PASSED TO THE SCRIPT
while getopts ":a:b:c:d:e:f:g:h:i:" opt; do
  echo "opt = $opt, OPTARG = $OPTARG \n"; 
  case $opt in
    a) feedDBUser="$OPTARG"
    ;;
    b) feedDBPassword="$OPTARG"
    ;;
    c) feedDBName="$OPTARG"
    ;;
    d) feedDBHost="$OPTARG"
    ;;
    e) projectDBUser="$OPTARG"
    ;;
    f) projectDBPassword="$OPTARG"
    ;;
    g) projectDBName="$OPTARG"
    ;;
    h) projectDBHost="$OPTARG"
    ;;
    i) additionalTables="$OPTARG"
    ;;
    \?) echo "Invalid option -$OPTARG" >&2
    ;;
  esac
done

if [ -z "$feedDBUser" ];
then 
    echo "No feed DB user. Quiting!";
    exit 1;
fi;

if [ -z "$feedDBPassword" ];
then 
    echo "No feed DB password. Quiting!";
    exit 1;
fi;

if [ -z "$feedDBName" ];
then 
    echo "No feed DB name. Quiting!";
    exit 1;
fi;

if [ -z "$feedDBHost" ];
then 
    echo "No feed DB host. Quiting!";
    exit 1;
fi;

if [ -z "$projectDBUser" ];
then 
    echo "No project DB user. Quiting!";
    exit 1;
fi;

if [ -z "$projectDBPassword" ];
then 
    echo "No project DB password. Quiting!";
    exit 1;
fi;

if [ -z "$projectDBName" ];
then 
    echo "No project DB name. Quiting!";
    exit 1;
fi;

if [ -z "$projectDBHost" ];
then
 echo "No project DB host. Quiting!";
    exit 1;
fi;

Если я запустил первую версию exportImportCommand, я увижу следующий результат:

$ php  /mnt/c/var/www/vhosts/dev.supadu-property-feed.com/debug_exec_sh/test-php-exec.php
Running command:
 /mnt/c/var/www/vhosts/dev.supadu-property-feed.com/debug_exec_sh/test.sh -aroot -bpsswd1 -cPROJECT1 -lhost1.local -eadmin -fpswsd2  -gPROJECT1 -hhost2.local
-i'';
+ printf 'Number of parameters passed:' 9
+ printf 'Parameters passed:' -aroot -bpsswd1 -cPROJECT1 -lhost1.local -eadmin -fpswsd2 -gPROJECT1 -hhost2.local -i
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ echo 'opt = a, OPTARG = root \n'
+ case $opt in
+ feedDBUser=root
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ echo 'opt = b, OPTARG = psswd1 \n'
+ case $opt in
+ feedDBPassword=psswd1
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ echo 'opt = c, OPTARG = PROJECT1 \n'
+ case $opt in
+ feedDBName=PROJECT1
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ echo 'opt = ?, OPTARG = l \n'
+ case $opt in
+ echo 'Invalid option -l'
Invalid option -l
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ echo 'opt = h, OPTARG = ost1.local \n'
+ case $opt in
+ projectDBHost=ost1.local
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ echo 'opt = e, OPTARG = admin \n'
+ case $opt in
+ projectDBUser=admin
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ echo 'opt = f, OPTARG = pswsd2 \n'
+ case $opt in
+ projectDBPassword=pswsd2
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ echo 'opt = g, OPTARG = PROJECT1 \n'
+ case $opt in
+ projectDBName=PROJECT1
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ echo 'opt = h, OPTARG = host2.local \n'
+ case $opt in
+ projectDBHost=host2.local
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ echo 'opt = :, OPTARG = i \n'
+ case $opt in
+ getopts :a:b:c:d:e:f:g:h:i: opt
+ '[' -z root ']'
+ '[' -z psswd1 ']'
+ '[' -z PROJECT1 ']'
+ '[' -z '' ']'
+ echo 'No feed DB host. Quiting!'
+ exit 1
array(11) {
  [0]=>
  string(71) "Number of parameters passed:Parameters passed:opt = a, OPTARG = root \n"
  [1]=>
  string(27) "opt = b, OPTARG = psswd1 \n"
  [2]=>
  string(29) "opt = c, OPTARG = PROJECT1 \n"
  [3]=>
  string(22) "opt = ?, OPTARG = l \n"
  [4]=>
  string(31) "opt = h, OPTARG = ost1.local \n"
  [5]=>
  string(26) "opt = e, OPTARG = admin \n"
  [6]=>
  string(27) "opt = f, OPTARG = pswsd2 \n"
  [7]=>
  string(29) "opt = g, OPTARG = PROJECT1 \n"
  [8]=>
  string(32) "opt = h, OPTARG = host2.local \n"
  [9]=>
  string(22) "opt = :, OPTARG = i \n"
  [10]=>
  string(25) "No feed DB host. Quiting!"
}

Однако, если я прокомментирую первую версию $ exportImportCommand и раскомментирую вторую, которая вызывает скрипт, используя следующие источники

<?php
    //$exportImportCommand = __DIR__ . "/test.sh -aroot -bpsswd1 -cPROJECT1 -lhost1.local -eadmin -fpswsd2  -gPROJECT1 -hhost2.local -i'';";
    $exportImportCommand = ". " . __DIR__ . "/test.sh -aroot -bpsswd1 -cPROJECT1 -lhost1.local -eadmin -fpswsd2  -gPROJECT1 -hhost2.local -i'';";
    printf("Running command:\n %s\n", $exportImportCommand);
    exec ($exportImportCommand, $shellOutput);
    var_dump($shellOutput);  
?>

Я получаю следующий результат:

$ php  /mnt/c/var/www/vhosts/dev.supadu-property-feed.com/debug_exec_sh/test-php-exec.php
Running command:
 . /mnt/c/var/www/vhosts/dev.supadu-property-feed.com/debug_exec_sh/test.sh -aroot -bpsswd1 -cPROJECT1 -lhost1.local -eadmin -fpswsd2  -gPROJECT1 -hhost2.loca
l -i'';
array(1) {
  [0]=>
  string(71) "Number of parameters passed:Parameters passed:No feed DB user. Quiting!"
}

Мои вопросы: почему сценарий оболочки видит переданные ему параметры, когда он вызывается как команда, но не когда он находится в php exe c?

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 04 августа 2020

Не могли бы вы попробовать это, пожалуйста?

export VARIABLE="Execution Test" && php -f script.php

И в вашем скрипте. php

<?php
print_r(getenv("VARIABLE"));
...