从 bash 脚本内部调用时找不到命令

Command NOT found when called from inside bash script

我的 Linux 盒子上安装了一个名为 puppet 的应用程序。它安装在位置 /usr/test/bin/puppet

这就是 .bash_profile 的样子

export PATH=/usr/test/bin

如果我从控制台运行命令 puppet apply,它工作正常,但是当我从 bash 脚本内部调用 puppet 命令时,它说找不到命令

#!/bin/bash
puppet apply x.pp

有什么问题吗?

您可以尝试使用 alias,像这样

在你的.bash_profile中:

alias puppet='bash puppet.fileextension'

你也可以

alias puppet='bash path/to/puppet.fileextension'

这将使您 运行 从终端中的任何地方运行脚本。

编辑:

OP在评论中说会有两个不同的系统运行ning,他问如何检查bash文件的文件路径。

如果你这样做

#!/bin/bash
runPuppet(){
 if [ -e path/to/system1/puppet.fileextension]
 then
 bash path/to/system1/puppet.fileextension  
 elif [ -e path/to/system2/puppet.fileextension]
 then
 bash path/to/system2/puppet.fileextension  
 fi
}
runPuppet apply x.pp

并将 runPuppet 输入更改为您想要的任何内容。

至clarify/explain:

-e是检查文件是否存在

</code> & <code>分别是前两个输入参数。

也许 PATH 的导出有误?

export PATH=$PATH:/usr/test/bin/puppet

.bash_profile 仅当 bash 作为登录 shell(bash -l 或来自真实的 tty)被调用时才会加载,至少在基于 Debian 的发行版中是这样 bash 在虚拟 tty 中(例如使用 xtermgnome-terminal 等时)被调用为交互式 shell.

Interactive shells 从 ~/.bashrc.

加载配置

bash 联机帮助页:

~/.bash_profile
   The personal initialization file, executed for login shells
~/.bashrc
   The individual per-interactive-shell startup file

Shellscripts 不加载任何这些。

您可以使用strace检查任何程序打开了哪些文件:

strace ./s.sh 2>&1 | grep -e stat -e open

可能的解决方案:

  1. 您可以在每个脚本的开头导出变量:

    #!/bin/bash
    export PATH=$PATH:...
    
  2. 或者您可以拥有另一个包含所需变量的文件,并从任何需要这些变量的脚本中获取它:

    /etc/special_vars.sh:

    export PATH=$PATH:...
    

    脚本:

    #!/bin/bash
    . /etc/special_vars.sh
    puppet ...
    
  3. ~/.bashrc~/.bash_profile~/.profile 中为用户 运行 配置 PATH 脚本(子进程将继承环境变量)以保证用户可以 运行 来自不同环境的脚本和 shells(除了 bash 之外的一些 bourne 兼容 shells加载 ~/.profile)