我的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)
关于什么是错的任何想法?
.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)
可能的解决方案:
您可以在每个脚本的开头导出变量:
#!/bin/bash
export PATH=$PATH:...
Run Code Online (Sandbox Code Playgroud)或者您可以使用具有所需变量的另一个文件,并从需要这些变量的任何脚本中获取它:
/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)配置PATH中~/.bashrc,~/.bash_profile并~/.profile运行该脚本的用户(子进程将继承环境变量)有一定的保证,用户可以运行不同的环境和外壳脚本(一些谍兼容弹别人比bash中做负载~/.profile)