Как закрыть строку так, как это делает bash в php CLI, или подавить вывод ошибок?

Если вы создадите простой php-скрипт с этим кодом:

shell_exec('"');

И запустите его с помощью:

php myscript.php

Это дает следующую ошибку в bash на моем Mac:

sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file

Я пробовал все, что мог придумать:

ob_start();
@shell_exec('"');
ob_end_clean();

@shell_exec('" 2> /dev/null');

Но что бы я ни пытался, я не могу подавить сообщение. Проблема в том, что я создаю модульный тест для стресс-тестирования $argc, $argv и команды getopt() для инструмента общего назначения, и мне нужно вызывать скрипт сотни раз с различными входными данными, содержащими случайные символы, такие как '" =: и т. д.

Поэтому мне нужно иметь возможность либо подавить вывод ошибки, либо обнаружить несбалансированные кавычки и добавить ' или " в конец строки. Я нашел это регулярное выражение для обнаружения строк с одинарными и двойными кавычками:

PHP: регулярное выражение для игнорирования экранированных кавычек внутри кавычек

Но у меня возникли проблемы с визуализацией того, как это сделать для общей команды bash, которая имеет сочетание аргументов в кавычках и без кавычек. Есть ли встроенная команда, которая сообщит мне, приемлема ли строка, не выдавая ошибки? Затем я мог бы попробовать добавить либо "'", либо ""', и я вполне уверен, что один из них закроет строку. На данный момент меня интересует только предотвращение сообщения об ошибке, потому что я просто бросаю случайный ввод в сценарий на данный момент.

Спасибо!


person Zack Morris    schedule 26.03.2013    source источник
comment
Вы уже пробовали escapeshellarg?   -  person Gumbo    schedule 26.03.2013
comment
неясно, что вы пытаетесь сделать, потому что 2> /dev/null не является допустимой командой bash.   -  person adrianj98    schedule 26.03.2013
comment
Да к обоим: я не могу использовать escapeshellarg(), потому что я пытаюсь передать искаженный запрос в CLI для стресс-теста getopt(). Кроме того, я представлял случайную строку команды, которую я передал, как двойную кавычку, я должен был быть более конкретным (после этого это команда со смесью символов).   -  person Zack Morris    schedule 28.03.2013
comment
Всем, кто все еще читает этот вопрос, я понял, что у меня до сих пор нет регулярного выражения или способа проверить строку, которую я передаю в shell_exec(). Это затрудняет порождение процессов в фоновом режиме, потому что я заранее не знаю, не сработают ли они при анализе аргументов, особенно если я закрою STDERR. Кажется, у php нет возможности перенаправить STDERR в переменную вместо вывода, хотя я могу ошибаться. Возможно, я слишком быстро дал ответ, но это было жизнеспособное решение моего вопроса.   -  person Zack Morris    schedule 28.03.2013


Ответы (1)


Дочерний процесс оболочки записывает сообщение об ошибке в STDERR, унаследованное от родительского процесса PHP. Вы можете закрыть родительский дескриптор файла STDERR в PHP-скрипте перед запуском shell_exec().

<?php
fclose (STDERR);
shell_exec('"');
person Don Zola    schedule 26.03.2013