Bash脚本切换目录执行命令提示‘drush: command not found’求助
drush: command not found的问题 这个问题的核心原因是脚本运行时的shell环境和你手动执行命令时的环境不一样,具体来说:
当你手动在终端输入命令时,bash是交互式登录shell,会完整加载你的.bashrc(或者.bash_profile)里的环境变量配置,包括drush所在目录的PATH设置。但当你运行脚本时,bash是非交互式非登录shell,你的.bashrc里很可能有这样的判断:
[[ $- != *i* ]] && return
这行代码会让非交互式shell直接退出.bashrc的加载,导致你source了.bashrc却没拿到drush的PATH配置,自然找不到命令。
下面是几个可行的解决办法:
方法1:直接使用drush的绝对路径
这是最直接的方案,先手动执行以下命令获取drush的绝对路径:
which drush
假设输出是/home/yourusername/.composer/vendor/bin/drush,把脚本里的drush status改成绝对路径形式:
#!/bin/bash source .bashrc && cd htdocs && /home/yourusername/.composer/vendor/bin/drush status
方法2:加载登录级别的环境配置
如果你的共享主机里有.bash_profile或者.profile文件(这些是登录shell会加载的配置,通常不会有非交互式退出的判断),可以把脚本里的source .bashrc改成:
#!/bin/bash source ~/.bash_profile && cd htdocs && drush status
如果.bash_profile不存在,试试source ~/.profile。
方法3:手动在脚本中添加PATH
直接在脚本里把drush所在的目录添加到PATH环境变量中,比如你通过which drush知道路径是/home/yourusername/.composer/vendor/bin,脚本可以写成:
#!/bin/bash export PATH="$PATH:/home/yourusername/.composer/vendor/bin" cd htdocs && drush status
这种方式不需要依赖.bashrc的加载,稳定性更高。
额外检查
如果以上方法都不行,可以在脚本开头加上echo $PATH,运行脚本后对比手动执行echo $PATH的输出,看看drush所在的目录是否在脚本的PATH里,这样就能快速定位问题。
内容的提问来源于stack exchange,提问作者user3108268

