Так как вывод сгенерирован, прежде чем статус выхода известен, необходимо будет сохранить его где-нибудь.
Одна возможность состоит в том, чтобы сохранить его в переменной оболочки:
output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
printf "%s\n" "$output"
fi
Это не полностью сохраняет вывод сценария (он удаляет строки конечного пробела), но это хорошо для этого варианта использования. Если Вы хотите сохранить строки конечного пробела:
output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
printf "%s" "${output%a}"
fi
Если существует потенциально большой вывод, Вы могли бы предпочесть хранить его во временном файле вместо этого:
output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
echo "script.php failed (status $ret), see the output in $output_file"
fi
Perl system("cmd")
функционируйте обычно разветвляет процесс, и в дочернем процессе, выполняет оболочку системы (обычно /bin/sh
) с как аргументы, ["sh", "-c", "cmd"]
, иметь sh
проанализируйте и выполните ту командную строку оболочки.
Как оптимизация, это может иногда обходиться без вызова оболочки, если cmd
не содержит метасимволов оболочки (как заключение в кавычки символов или globbing символов или вещей как ;
, &&
...) кроме пространства и вкладки, но здесь у нас есть метасимволы оболочки, так как у нас есть a *
.
Так, это ls -U -1 dir/*
будет интерпретироваться оболочкой системы.
Это - оболочка, которая расширяется dir/*
к списку соответствия файлам, переданным ls
, таким образом, способ, которым это сделано, зависит от оболочки.
В терминале Вы обычно выполняете свою оболочку входа в систему, которая обычно является нет /bin/sh
. Также (как отмечено peterph), та оболочка, так как это выполняется в интерактивном режиме, будет обычно читать конфигурационные файлы как ~/.zshrc
(если оболочка zsh
) где некоторые настройки могли бы влиять, как globbing сделан.
Например:
Моя оболочка zsh
, и у меня есть a setopt dotglob
в моем ~/.zshrc
, так:
$ echo *
.a d é f
Не читая ~/.zshrc
:
$ zsh -c 'echo *'
d é f
$ LC_ALL=C zsh -c 'echo *'
d f é
Вы заметите это zsh
соблюдает локаль при сортировке списка.
$ sh -c 'echo *'
d f é
sh
(который в моем случае является Debian ash
) не соблюдает локаль и виды как будто в локали C.
Если Вы хотите perl
system()
для интерпретации командной строки с конкретной оболочкой можно записать это:
system("zsh", "-c", "cmd");
При передаче больше что один аргумент, perl
system()
никогда неявно называет оболочку, таким образом, выше, она разветвляет процесс, в котором она работает /bin/zsh
с ["zsh", "-c", "cmd"]
как аргументы.