Почему порядок подстановочных результатов мог бы отличаться при использовании от терминала или от жемчуга?

Так как вывод сгенерирован, прежде чем статус выхода известен, необходимо будет сохранить его где-нибудь.

Одна возможность состоит в том, чтобы сохранить его в переменной оболочки:

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
2
11.10.2013, 00:02
1 ответ

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"] как аргументы.

6
27.01.2020, 21:54
  • 1
    я запускаю Ubuntu, которая делает sh значение по умолчанию для подчеркивания штриховой линией (который является тем, что жемчуг закончит тем, что использовал), но удар использования для терминала. Действительно, явно говорящий жемчуг для использования удара заставляет обе опции возвратить те же результаты. Спасибо @StephaneChazelas. –  Luis 10.10.2013, 15:47

Теги

Похожие вопросы