имеет тестовый сценарий 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?
Любая помощь очень ценится!