Мне нужно предотвратить весь вывод php, https://stackoverflow.com/a/617184/1695680 описывает, как это сделать в целом, и для исключений, ошибок, синтаксических ошибок до сих пор он работал, но.
php для создания segfault в расширении pcre: https://ilia.ws/archives/5_Top_10_ways_to_crash_PHP.html
<?php # prce-bug.php preg_match('/(.(?!b))*/', str_repeat("a", 10000));
В моем тестировании это все еще выводит:
user@host ~/crash-php $ php pcre-bug.php Segmentation fault (core dumped) user@host ~/crash-php $ php pcre-bug.php >/dev/null 2>&1 Segmentation fault (core dumped)
Таким образом, даже с перенаправлением вывода оболочки выход выводится на мой терминал.
Перенаправление вывода применяется к процессу, однако сообщение segfault генерируется самим bash в результате того, что дочерний процесс умирает с segfault.
Одним из решений было бы сделать что-то вроде этого:
echo `php pcre-bug.php >/dev/null 2>&1`
Я обнаружил, что использование нового экземпляра sh
будет захватывать системные сообщения о смерти процесса, такие как «Дефект сегментации» и «Убитый».
sh -c 'php pcre-bug.php' >/dev/null 2>&1
Однако входные аргументы не идут на php, а скорее на sh-экземпляр, который ничего не делает с ними.
Вы можете использовать составные команды { }
:
$ { php pcre-bug.php; } &>/dev/null $ $ echo $? 139
Из руководства Bash -> 3.2.4 Составные команды -> 3.2.4.3 Команды группировки и man bash
:
Составные команды
{list; }
список просто выполняется в текущей среде оболочки. список должен быть прерван символом новой строки или точкой с запятой.
Это называется групповой командой. Статус возврата – это статус выхода списка. Обратите внимание, что в отличие от метасимволов (и), {и} являются зарезервированными словами и должны встречаться там, где зарезервированное слово разрешено распознавать.
Поскольку они не вызывают разрыв слова, они должны быть отделены от списка пробелом или другим метасимволом оболочки.
Однако использование ( )
не работает, и я не знаю, почему:
$ ( php pcre-bug.php ) &>/dev/null Segmentation fault (core dumped)