Php exec() не возвращает сообщение об ошибке на выходе при выполнении команды svn
Я пытаюсь получить определенный вывод для команды svn в формате XML. Выходные данные в порядке, когда я вводим допустимые параметры. Однако при вводе неправильного пароля вывод не отображает сообщение об ошибке.
Это код PHP:
exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output);
Вот вывод, который я получаю в терминале:
<?xml version="1.0"?>
<log>
svn: OPTIONS of 'http://a51.unfuddle.com/svn/a51_activecollab': authorization failed: Could not authenticate to server: rejected Basic challenge (http://a51.unfuddle.com)
И вот результат, который я получаю из переменной $output с var_dump:
array(2) {
[0]=>
string(21) "<?xml version="1.0"?>"
[1]=>
string(5) "<log>"
}
Как вы можете видеть, переменная $output не возвращает третью строку вывода, на которой работает терминал. Пожалуйста, помогите мне получить тот же результат, что и в терминале (я даже пробовал с помощью методов shell_exec() или system(), но они возвращают тот же результат, что и exec()). Как получить полный вывод?
Заранее благодарю вас!
Ответы
Ответ 1
Вам нужно также захватить stderr
.
Перенаправление stderr
в stdout
должно сделать трюк. Добавьте 2>&1
в конец вашей команды.
например.
exec("/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/ 2>&1", $output);
Ответ 2
Это, вероятно, не решение, просто плохая идея: вы пытались добавить дополнительное эхо в команду:
exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/;**echo ""**', $output);
И другой способ решить это, как уже упоминалось: если у вас нет последней строки в выводе $, это все равно в возвращаемом значении функции exec().
Тогда у вас будет
$totalOutput = push($msg,$output);
с
$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output);
Ответ 3
Вам нужно определить переменную, в которой будет сохраняться сообщение
$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/');