我有一个名为puppet的应用程序安装在我的Linux机器上。 它安装在/usr/test/bin/puppet
这是.bash_profile
外观
export PATH=/usr/test/bin
如果我从控制台运行命令puppet apply
,它工作正常,但是当我从bash脚本中调用puppet
命令时,它说没有find命令
#!/bin/bash puppet apply x.pp
任何想法是什么错?
你可以尝试使用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
分别是前两个输入参数。
.bash_profile
仅在bash被调用为登录shell( bash -l
或来自真正的tty)时才被加载,至少在基于Debian的发行版bash中是虚拟的tty(例如,当使用xterm
, gnome-terminal
等时)被调用为交互式shell。
交互式shell从~/.bashrc
加载配置。
bash manpage:
~/.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
可能的解决方案:
您可以在每个脚本的开头导出变量:
#!/bin/bash export PATH=$PATH:...
或者你可以使用其他文件,并使用所需的变量,并从任何需要这些变量的脚本获取它:
/etc/special_vars.sh:
export PATH=$PATH:...
脚本:
#!/bin/bash . /etc/special_vars.sh puppet ...
在~/.bashrc
, ~/.bash_profile
和~/.profile
为运行脚本的用户(子进程将继承环境变量)配置PATH
,以保证用户可以从不同的环境运行脚本shell(bash之外的一些bourne兼容shell加载~/.profile
)
也许PATH
的出口是错误的?
export PATH=$PATH:/usr/test/bin/puppet