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

时间:2015-01-08 00:07:58

标签: linux bash puppet

我的Linux机器上安装了一个名为puppet的应用程序。它安装在/usr/test/bin/puppet

位置

这就是.bash_profile看起来

的方式
export PATH=/usr/test/bin

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

#!/bin/bash
puppet apply x.pp

关于什么是错的任何想法?

3 个答案:

答案 0 :(得分:5)

只有当bash作为登录shell(.bash_profile或来自真实tty)被调用时才加载

bash -l,至少在基于Debian的发行版中,bash在虚拟tty中(例如当使用{{1时) }},xterm等...被调用为交互式shell。

交互式shell从gnome-terminal加载配置。

bash手册页:

~/.bashrc

Shellscripts不会加载任何这些。

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

检查任何程序打开的文件
strace

可能的解决方案:

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

    strace ./s.sh 2>&1 | grep -e stat -e open
    
  2. 或者您可以使用所需变量生成另一个文件,并从需要这些变量的任何脚本中获取该文件:

    /etc/special_vars.sh:

    #!/bin/bash
    export PATH=$PATH:...
    

    脚本:

    export PATH=$PATH:...
    
  3. #!/bin/bash . /etc/special_vars.sh puppet ... PATH~/.bashrc中的~/.bash_profile配置运行脚本的用户(子流程将继承环境变量)保证用户可以从不同的环境和shell运行脚本(某些bourne兼容的shell而不是bash加载~/.profile

答案 1 :(得分:3)

也许导出PATH是错误的?

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

答案 2 :(得分:1)

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

.bash_profile

alias puppet='bash puppet.fileextension'

你也可以

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

可以让你从终端的任何地方运行脚本。

编辑:

OP在评论中表示将运行两个不同的系统,并询问如何检查bash文件的文件路径。

如果你这样做

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

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

澄清/解释:

-e用于检查文件是否存在

$1& $2分别是前两个输入参数。