/usr/bin/env: php: 没有此文件或目录

/usr/bin/env: php: 没有此文件或目录

我想使用 .sh 脚本来部署我的应用程序。该脚本位于我的家庭服务器 (Ubuntu 15.10 Server) 上,标记为可执行文件。通过 ssh 访问此脚本,使用教程中,我已设置运行该脚本的 ssh 登录。因此基本上我只需调用它,它就会以参数运行我的脚本。用户的 uid=0,因此基本上(这将在将来更改,我仅设置它以消除权限问题,直到它正常工作)。ssh [email protected] someArgumentssomeArgumentsdeployerroot

事情变得棘手了。脚本报告/usr/bin/env: php: No such file or directoryat 命令/bin/composer install(使用作曲家)。我越看这个脚本,事情就越奇怪。在这行之前,还有一个调用/bin/composer self-update/bin/composer -V,它们都可以正确运行并显示正确的输出。

我已经检查了以下事项:

  • /usr/bin/env php -v显示正确的 PHP 版本(与 相同/usr/bin/php -v
  • whereis php显示器php: /usr/bin/php /usr/local/bin/php /usr/share/man/man1/php.1.gz
  • php5-cli软件包已安装且为最新版本
  • $PATH包含/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
  • which env显示器/usr/bin/env

我也尝试过以下事情:

  • 直接以 root 身份运行脚本bash deploy.sh(因为它与该用户相同) - 完美运行,没有错误
  • 直接运行失败的命令 - 也没有错误

所以在我看来,这是一个非常特殊的情况,为什么这个命令不起作用。我花了 12 个小时来调试它,但我没有主意了。

附言:类似的错误(/usr/bin/env: node: No such file or directory)发生在bower install(使用鲍尔), 但不是运行时npm install(使用新平台)。

答案1

确保行尾和/或不可见空格不会引起问题。

删除脚本第一行的空格并插入新的空格,确保不要在按空格键时按住 CTRL 键。

另外,请确保没有 DOS 行尾 (CR+LF)。请参阅https://stackoverflow.com/questions/82726/convert-dos-line-endings-to-linux-line-endings-in-vim了解详情。

答案2

env命令将查看用户的目录$PATH以查找给定名称的第一个可执行文件。因此,将在运行它的用户的任何目录中/usr/bin/env php查找调用的可执行文件。php$PATH

就您而言,这几乎肯定是因为在 上运行命令时ssh,您不会启动完整的 shell,也不会真正读取 shell 的初始化文件。您可以通过运行以下命令来检查这一点(请注意单引号):

ssh [email protected] 'echo $PATH'

并将输出与你得到的结果进行比较ssh [email protected]然后在我的系统上运行echo $PATH。例如:

$ echo $PATH
/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:

$ ssh localhost 'echo $PATH'
/usr/bin:/bin:/usr/sbin:/sbin

因此,$PATH脚本运行时可以访问的内容与您登录测试时访问的内容不同。ssh [email protected]

无论如何,简单的解决方案是使用解释器的完整路径而不是envenv和完整路径都有各自的优点和缺点但在这种情况下,路径更安全:

#!/usr/bin/php

答案3

最简单的方法....将用户的shell更改为脚本。

密码文件 /etc/passwd

Before:
deploy:x:0:0:,,,:/root:/bin/bash

After:
deploy:x:0:0:,,,:/root:/scripts/deploy.sh

示例脚本(确保执行位设置 chmod +x)

/scripts/deploy.sh

#!/bin/bash 
PATH=$PATH:/moo etc...
moo.sh

样本 每次都有效!您甚至应该能够使用该脚本来排除/调试您可能认为未设置的任何环境变量等......此外,传递到 ssh 的处理参数也将正常工作。

注意:最佳做法是始终完全限定任何脚本、可执行文件等的路径。以上只是一个示例,允许将默认路径设置为在 moo 文件夹中调用 moo.sh;)

这很简单..感谢您的发帖..

参考:/etc/passwd 格式

答案4

看起来您可能需要将 php 添加到您的路径中。尝试:

vim ~/.bashrc
PATH=$PATH:/usr/local/bin/php
export PATH

您可能还想检查 php 所在的位置,以确保那里的路径正确。尝试:

which php

相关内容