使用执行位运行 CLI php 脚本

发布于 2024-11-27 06:34:19 字数 332 浏览 1 评论 0原文

这让我有点烦恼。

我知道你可以做

php foo.php

或者

php -f foo.php

没有办法只启动一个设置了执行位的脚本

./foo.php

给定以下内容:

#!/usr/bin/php

<?php 
exit('hello');

我得到“无法打开输入文件”或“错误的解释器:没有这样的文件或目录”,具体取决于后面是否有空格“bin/php”。

This has been bugging me slightly.

I know you can do

php foo.php

or

php -f foo.php

Is there no way to just launch a script with the execute bit set

./foo.php

Given the folowing:

#!/usr/bin/php

<?php 
exit('hello');

I get "Could not open input file" or " bad interpreter: No such file or directory" depending on if there's whitespace after "bin/php".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

北城半夏 2024-12-04 06:34:19

使用 #!/usr/bin/env php 代替 #!/usr/bin/php 是更好的解决方案。这将在 PATH 环境变量中查找 PHP 二进制文件。这更加更加强大并且更可靠。跨平台。例如,BSD 将 PHP 安装在 /usr/local/bin/php 中。

此外,您需要确保这是第一行,并且脚本设置了可执行位,以便为每个人设置它(通常可以)使用:chmod a+x script .php

另外请确保您已启用 CLI SAPI。运行 php -v top verify,它应该显示如下内容:

[~]% php -v
PHP 5.3.3 (cli) (built: Jul 22 2010 16:21:30)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

Instead of #!/usr/bin/php, using #!/usr/bin/env php is a better solution. This will look up the PHP binary in the PATH environment variable. This is much more robust & crossplatform. BSD for example installs PHP in /usr/local/bin/php.

Further, you will need to make sure this is the first line, and that the script has the executable bit set, to set it for everyone (Generally OK) use: chmod a+x script.php

Also make sure you have the CLI SAPI enabled. Run php -v top verify, it should show something like:

[~]% php -v
PHP 5.3.3 (cli) (built: Jul 22 2010 16:21:30)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
撞了怀 2024-12-04 06:34:19
  1. 检查 '#!' 之前是否有任何内容,例如 UTF-8 BOM
  2. 检查行尾是否没有任何内容,例如最后 LF (\n) 之前的 CR (\r)。如果您在 Windows 中使用 Windows 行结尾 (CR LF) 编写文件,则 CR 会出现在那里,并且可能会被解释为解释器路径的一部分。
  1. Check if you have nothing before '#!', like an UTF-8 BOM
  2. Check if you don't have anything at the end of the line, like CR (\r) befor the final LF (\n). The CR goes there if you write the file in Windows with windows line endings (CR LF) and may be interpreted as a part of the interpreter path.
瞎闹 2024-12-04 06:34:19

您给出的示例代码看起来不错并且适合我(不过我添加了结束 ?>

如果您可以使用 /usr/bin/php foo.php 运行该文件 发生了一些奇怪的事情。只是一个大胆的猜测,但也许您的文本编辑器在文件的开头留下了 BOM(字节顺序标记),因此 #! 不是该文件中的前两个字节。 (您可以通过执行 hexdump -C foo.php | head 找到)

The example code you've given seems OK and works for me (I added the the closing ?> though)

If you can run the file with /usr/bin/php foo.php there's something weird going on. Just a wild guess, but maybe you text editor leaves a BOM (byte order mark) at the beginning of the file, so that the #! aren't the very first two bytes in that file. (you can find out by doing hexdump -C foo.php | head)

夏了南城 2024-12-04 06:34:19

来自 php(1) 联机帮助页:

提示

您可以使用 shebang 行自动调用 php
脚本。只有 PHP 的 CLI 版本才会忽略这样的第一行
如下图所示:

<前><代码>#!/bin/php

所以,shebang 方法确实有效。如果我在 Vim 中将行结尾设置为“unix”以外的内容,则会收到“:没有这样的文件或目录”。您在脚本中使用 DOS 行结尾吗?

From the php(1) manpage:

TIPS

You can use a shebang line to automatically invoke php from
scripts. Only the CLI version of PHP will ignore such a first line as
shown below:

#!/bin/php
<?php
// your script
?>

So, the shebang method does work. I'm getting ": No such file or directory" if I set line endings to something other than "unix" in Vim. Are you using DOS line endings in your script?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文