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

Gar*_*ary 2 linux bash puppet

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

这是.bash_profile看起来如何

export PATH=/usr/test/bin
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
puppet apply x.pp
Run Code Online (Sandbox Code Playgroud)

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

Fer*_*ndo 5

.bash_profile如果bash援引为登录shell(仅加载bash -l(当使用例如或从真实TTY),至少在虚拟TTY基于Debian发行的bash xterm,gnome-terminal等...)被调用作为交互式外壳.

交互式shell加载配置~/.bashrc.

bash手册页:

~/.bash_profile
   The personal initialization file, executed for login shells
~/.bashrc
   The individual per-interactive-shell startup file
Run Code Online (Sandbox Code Playgroud)

Shellscripts不加载任何这些.

您可以通过以下方式检查任何程序打开的文件strace:

strace ./s.sh 2>&1 | grep -e stat -e open
Run Code Online (Sandbox Code Playgroud)

可能的解决方案:

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

    #!/bin/bash
    export PATH=$PATH:...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者您可以使用具有所需变量的另一个文件,并从需要这些变量的任何脚本中获取它:

    /etc/special_vars.sh:

    export PATH=$PATH:...
    
    Run Code Online (Sandbox Code Playgroud)

    脚本:

    #!/bin/bash
    . /etc/special_vars.sh
    puppet ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 配置PATH~/.bashrc,~/.bash_profile~/.profile运行该脚本的用户(子进程将继承环境变量)有一定的保证,用户可以运行不同的环境和外壳脚本(一些谍兼容弹别人比bash中做负载~/.profile)