Выполнить строку кода PHP в командной строке
Я хотел бы иметь возможность запускать строку кода PHP в командной строке, аналогичную тому, как работают следующие параметры:
:~> perl -e "print 'hi';"
:~> python -c "print 'hi'"
:~> ruby -e "puts 'hi'"
Я хотел бы иметь возможность:
:~> php "echo 'hi';"
Я читал, что есть опция -r, которая может делать то, что мне нужно для php, но, похоже, она не доступна, когда я пытаюсь ее использовать. Я пробовал использовать PHP 5.2.13 и PHP 4.4.9, а также не имеет опции -r.
Я написал этот script (который я назвал run_php.php) - который работает, но я не являюсь его большим поклонником только потому, что чувствую, что должен быть более "правильный" способ сделать это.
#!/usr/bin/php5 -q
<?php echo eval($argv[1]); ?>
Мой вопрос: есть ли опция -r? Если да, то почему он недоступен, когда я запускаю --help? Если нет опции -r, что это лучший способ сделать это (не записывая посредника script, если это возможно)?
Спасибо!
=== РЕДАКТИРОВАТЬ ===
Поскольку я не думаю, что это было очень ясно выше, опция -r НЕ доступна мне. Вот вывод php -h для обеих версий PHP, которые я запускаю.
PHP 4.4.9
Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
php <file> [args...]
-a Run interactively
-C Do not chdir to the script directory
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse <file>. Implies `-q'
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-q Quiet-mode. Suppress HTTP Header output.
-s Display colour syntax highlighted source.
-v Version number
-w Display source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
php 5.2.13
Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
php <file> [args...]
-a Run interactively
-C Do not chdir to the script directory
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse <file>. Implies `-q'
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-q Quiet-mode. Suppress HTTP Header output.
-s Display colour syntax highlighted source.
-v Version number
-w Display source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
Существует опция NO -r. Когда я пытаюсь использовать параметр -r, я получаю:
Error in argument 1, char 2: option not found r
Извините за путаницу.
Ответы
Ответ 1
EDIT2: Да, это там, в PHP 5.2 cli SAPI.
РЕДАКТИРОВАТЬ: Если вы не можете обновить и что случай нет такой опции в PHP 5.2 (у меня ее нет под рукой для тестирования), вы можете сделать это:
[email protected]:~$ echo "<?php echo \"hi\\n\";" | php
hi
Оригинал:
Есть действительно опция -r
(хотя я не уверен в PHP 5.2):
D:\>php -r "echo 'hi';";
hi
Просто убедитесь, что вы используете версию PHP для командной строки. php --version
должен дать вам что-то вроде этого (обратите внимание на "cli" ):
D:\>php --version
PHP 5.3.0 (cli) (built: May 20 2010 19:05:12) (DEBUG)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
Ответ 2
В новых версиях PHP вы просто набираете "php -a", и вы прыгаете в интерактивный режим, где вы можете экспериментировать с PHP.
Ответ 3
Взгляните на эту страницу на функции командной строки PHP, если вы еще этого не сделали. Есть несколько сообщений о проблемах на основе ОС и двойных или одинарных кавычек.
Я бы также проверил информацию PHP
php -i
чтобы узнать, был ли PHP скомпилирован с отключенной поддержкой CLI (--disable-cli).
Ответ 4
В конце концов не требуется дополнительной полуколонки.
Вы можете указать php -r "echo 'hi';"
вместо php -r "echo 'hi';";
Другой пример (для получения текущей метки времени в командной строке):
php -r 'print time()."\n";'
Ответ 5
Самый простой способ сделать это - использовать флаг -r. Однако я обнаружил, что он не допускает многострочные входы. Чтобы обойти это, вы можете сделать это:
php -r "passthru(file_get_contents('php://stdin'));"
Это позволяет вам транслировать из stdin, например:
echo -n "echo 'test';" | php -r "passthru(file_get_contents('php://stdin'));"
Однако, чтобы ответить на исходный вопрос, если у вас нет флага -r, также можно использовать флаг -f - просто передать stdin в качестве файла для открытия: php -f /dev/stdin
Если вы это сделаете, имейте в виду, что a) вам нужно включить пробел в начале ввода, и b) вам нужно открыть с помощью <?php
. Пример:
echo -ne " <?php\necho 'test';" | php -f /dev/stdin