Как добавить Шебанг #! с php-скриптом в Linux?

У меня небольшая проблема с добавлением shebang #! с моим php-скриптом на RedHat linux. У меня есть небольшой фрагмент тестового кода с добавлением shebang (я также пробовал разные варианты), но я получаю следующее сообщение об ошибке каждый раз, когда пытаюсь запустить скрипт.

Сообщение об ошибке:

-bash: script.php: command not found

Тестовый сценарий:

#!/bin/env php    
<?php echo "test"; ?>

Шебанг #! вариации:

#!/usr/bin/php
#!/usr/bin/env php

person user2799603    schedule 12.02.2014    source источник
comment
Это очевидно - поэтому он и спрашивает :)   -  person Banago    schedule 12.02.2014
comment
@JoelFan документация PHP, кажется, не согласна с вами: php .net/manual/en/features.commandline.usage.php#example-375   -  person Digital Chris    schedule 12.02.2014
comment
@JoelFan — люди могут свободно выражать свои глупые мысли в блогах, не делайте этого на сайте, где мы помогаем другим разработчикам. Спасибо. Чтобы ответить на вопрос об ошибке - это, скорее всего, из-за комбинации CR\LF, которая идет после вашей первой строки. Используйте шестнадцатеричный редактор, чтобы проверить, есть ли у вас \n\r, и если да, удалите возврат каретки. CHMOD +x yourfile.php, чтобы сделать его исполняемым.   -  person N.B.    schedule 12.02.2014
comment
оффтоп, надо перенести в шелл   -  person user3694243    schedule 24.05.2019


Ответы (5)


Он должен (для большинства систем) быть #!/usr/bin/env php, но ваша ошибка не связана с этим.

-bash: script.php: command not found

Пишет, что script.php не найден.

Если бы проблема заключалась в строке Шебанга, тогда ошибка говорила бы что-то вроде:

bash: script.php: /usr/env: bad interpreter: No such file or directory

Предположительно, вы вводите script.php, а файл находится не в каталоге на вашем $PATH или не является исполняемым.

  1. Сделать его исполняемым: chmod +x script.php.
  2. Введите путь к нему, а не просто имя файла, если он находится в текущем каталоге, то: ./script.php.

Вместо 2 вы можете переместить/скопировать/символизировать файл куда-нибудь, указанный в $PATH или изменить $PATH, чтобы включить каталог, содержащий скрипт.

person Quentin    schedule 12.02.2014
comment
Также убедитесь, что в сценарии есть окончания строк Unix, а не DOS. Окончания строк DOS дадут вам аналогичную ошибку. - person Nigel Atkinson; 13.11.2014

Если ваш скрипт не находится в вашем /usr/local/bin и является исполняемым, вы должны добавить префикс вызова вашего скрипта с php следующим образом:

php myscrip.php

Для shebangs, вот что я использую:

Как это:

#!/usr/bin/php

или это:

#!/usr/bin/env php
person Banago    schedule 12.02.2014
comment
#!/usr/bin/env php предпочтительнее, так как позволяет системе сказать, где установлен исполняемый файл - person robrecord; 18.12.2019

В ответ на комментарий @NVRM о единственном использовании -d это неверно.

Начните с chmod +x script как

#!/usr/bin/php
<?php
phpinfo();

и запустите script | grep -E 'memory_limit|error_reporting', и вы увидите

error_reporting => no value => no value
memory_limit => 128M => 128M

Теперь добавьте несколько -d записей, чтобы у вас было

#!/usr/bin/php -d memory_limit=2G -d error_reporting=-1
<?php
phpinfo();

и повторно запустите script | grep -E 'memory_limit|error_reporting', и теперь вы увидите

error_reporting => -1 => -1
memory_limit => 2G => 2G

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

На самом деле, вся командная строка — это то, с чем вы здесь работаете. Таким образом, вы можете загружать расширения, использовать другую конфигурацию и т. д., все, что вы можете делать в командной строке.

person Richard A Quadling    schedule 01.01.2020

Оставив здесь несколько небольших заметок:


Чтобы использовать двоичный файл php, расположенный в той же папке.

Например, исполняемый файл php7.2, скопированный из /usr/bin, находится по тому же пути, что и скрипт hello.

#!./php7.2
<?php

echo "Hello!"; 

Чтобы запустить его:

./hello

Которые ведут себя так же, как:

./php7.2 hello

Это дает переносимость, но остерегайтесь системных архитектур, двоичный файл php может не соответствовать целевой платформе.


Установка разрешенной памяти из хэш-банга:

Мы можем установить одну запись INI из строки hashbang:

#!/usr/bin/php -d memory_limit=2048M
<?php
phpinfo();
exit;

Затем, чтобы увидеть, понял ли php, используя phpinfo():

./myphpProg | grep memory

Правильный вывод оболочки должен содержать:

memory_limit => 2048M => 2048M

Выполнение вышеописанного аналогично этой командной строке:

php -d memory_limit=2048M myphpProg.**php**

Вот почему мы можем установить только одно значение ini в hashbangs, так как php одновременно принимает только один параметр -d.

person NVRM    schedule 07.09.2019
comment
Допускается несколько вариантов. См. мой ответ stackoverflow.com/a/59552213/2161941 - person Richard A Quadling; 01.01.2020

найти вызываемый шебанг для PHP в Linux, не запоминайте его, научитесь его использовать


which php

выход


zeus@pop-os:~$ which php
/usr/bin/php



тогда Шебанг должен быть

#!/usr/bin/php  
person dılo sürücü    schedule 09.10.2020