我的Linux机器上安装了一个名为puppet的应用程序。它安装在/usr/test/bin/puppet
这就是.bash_profile
看起来
export PATH=/usr/test/bin
如果我从控制台运行命令puppet apply
,它工作正常但是当我从bash脚本中调用puppet
命令时,它说命令未找到
#!/bin/bash
puppet apply x.pp
关于什么是错的任何想法?
答案 0 :(得分:5)
.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
可能的解决方案:
您可以在每个脚本的开头导出变量:
strace ./s.sh 2>&1 | grep -e stat -e open
或者您可以使用所需变量生成另一个文件,并从需要这些变量的任何脚本中获取该文件:
/etc/special_vars.sh:
#!/bin/bash
export PATH=$PATH:...
脚本:
export PATH=$PATH:...
为#!/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'
可以让你从终端的任何地方运行脚本。
如果你这样做
#!/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
分别是前两个输入参数。