Передача аргументов туда и обратно между PHP и оболочкой

Я пытаюсь передавать аргументы туда и обратно, из оболочки в PHP и обратно. В моем простом тесте я легко перехожу из оболочки в PHP, но мне не удается вернуть строки. Я пробовал и escapeshellarg, и escapeshellcmd, но ни один из них не работал.

Оболочка

#!/bin/sh

# set a date and time variables, in the form of  YYYY-MM-DD and HH:MM:SS
dateVar=`date +%Y-%m-%d`
timeVar=`date +%H_%M`

# Launching PHP
runPHP=`which php`
$runPHP calledPHP.php $timeVar $dateVar

# Returned from PHP
passTime=$1
echo "$passTime"

passDate=$2
echo "$passDate"

PHP

<?php

setlocale(LC_CTYPE, "en_US.UTF-8");
echo "PHP called.\n";
$logTime = $argv[1]."\n";
//    echo $logTime;
$logDate = $argv[2]."\n";
//    echo $logDate;

$passTime = escapeshellarg('Time: $logTime'); 
$passDate = escapeshellarg('Date: '.$logDate);

?>

Запустив оболочку, единственное эхо, которое она возвращает, это «PHP вызывается». Как видите, я пробовал два разных синтаксиса в последних двух переменных php. Ни то, ни другое не работает. Есть ли лучшая функция для этого? Или я просто использую неправильный синтаксис?

Спасибо заранее за любые предложения


person LOlliffe    schedule 02.09.2014    source источник
comment
ваш PHP-код ничего не выводит, КРОМЕ вашего одного php called эха. И ваша строка $logTime неверна. Строки в '-кавычках в PHP НЕ интерполируют переменные. ваш $passTime будет буквально содержать $, l, o, g и т. д.   -  person Marc B    schedule 03.09.2014
comment
Первоначально я нашел пример для $passDate, и он показался мне правильным, но я согласен со строкой в ​​кавычках '. Я попробовал это только для полноты, потому что это был рабочий пример, который я нашел, хотя он явно не работал для меня. На самом деле я не пытаюсь получить какой-либо вывод как таковой из PHP, за исключением передачи строки из PHP обратно в охватывающий сценарий оболочки.   -  person LOlliffe    schedule 03.09.2014


Ответы (2)


В сценарии PHP вам придется echo все, что вы хотите, чтобы сценарий оболочки получил в качестве «возвращаемого значения». Имейте в виду, что на самом деле вы ничего не возвращаете. Вы печатаете на стандартный вывод. Затем вы должны записать этот stdOut в переменную в сценарии оболочки, используя someVariable=$(ExecuteScriptThatOutputsStdOut).

Вот аналогичный вопрос/ответ: перенаправить вывод команды в переменный и стандартный вывод в ksh

Вот ваш код, измененный для получения/распечатки вывода из PHP-скрипта. Есть и другие странности, которые вы, вероятно, захотите изменить, хотя это отдельная тема. (переводы строки в конце назначений в php, экранирование аргументов оболочки с жестко запрограммированными метками в них.)

Если вам нужны дата и время отдельно, вам придется либо вызвать два отдельных php-скрипта, либо в сценарии оболочки вам придется проанализировать вывод из сценария PHP и разделить результат на две переменные.

Сценарий оболочки

#!/bin/sh

# set a date and time variables, in the form of  YYYY-MM-DD and HH:MM:SS
dateVar=`date +%Y-%m-%d`
timeVar=`date +%H_%M`

# Launching PHP
runPHP=`which php`
phpResult=$($runPHP calledPHP.php $timeVar $dateVar)

# Returned from PHP
echo "The php result is: $phpResult"

PHP

<?php

setlocale(LC_CTYPE, "en_US.UTF-8");
//echo "PHP called.\n";
$logTime = $argv[1]."\n";
//    echo $logTime;
$logDate = $argv[2]."\n";
//    echo $logDate;

$passTime = escapeshellarg("Time: $logTime");
$passDate = escapeshellarg("Date: $logDate");

echo "$passTime, $passDate";
?>
person Evan de la Cruz    schedule 02.09.2014
comment
Большое спасибо за помощь. Я вообще не понимал, как работают примеры, которые я нашел. Я не понял, как PHP передает аргументы в переменные $1 и $2. Ваш пример имеет больше смысла. Для всех, кому может помочь этот пример, окончательное эхо оболочки, показывающее переменную: The php result is: 'Time: 17_36', 'Date: 2014-09-02', поэтому, если вам просто нужно необработанное время или дата, вам нужно будет их дополнительно обработать, но теперь, по крайней мере, вы знаете, как чтобы получить некоторые данные для работы. - person LOlliffe; 03.09.2014

Когда сценарий оболочки вызывает внешнюю программу, единственное, что он может захватить, — это вывод программы. Состояние программы (среда, переменные и т. д.) исчезает при выходе из процесса программы.

Вам нужно будет настроить так, чтобы ваш PHP-скрипт выдавал данные на стандартный вывод (т.е. echo it), а сценарий оболочки анализировал вывод (обычно с помощью команды read)

person glenn jackman    schedule 02.09.2014