从 bash 脚本内部调用时找不到命令
Command NOT found when called from inside bash script
我的 Linux 盒子上安装了一个名为 puppet 的应用程序。它安装在位置 /usr/test/bin/puppet
这就是 .bash_profile
的样子
export PATH=/usr/test/bin
如果我从控制台运行命令 puppet apply
,它工作正常,但是当我从 bash 脚本内部调用 puppet
命令时,它说找不到命令
#!/bin/bash
puppet apply x.pp
有什么问题吗?
您可以尝试使用 alias
,像这样
在你的.bash_profile
中:
alias puppet='bash puppet.fileextension'
你也可以
alias puppet='bash path/to/puppet.fileextension'
这将使您 运行 从终端中的任何地方运行脚本。
编辑:
OP在评论中说会有两个不同的系统运行ning,他问如何检查bash文件的文件路径。
如果你这样做
#!/bin/bash
runPuppet(){
if [ -e path/to/system1/puppet.fileextension]
then
bash path/to/system1/puppet.fileextension
elif [ -e path/to/system2/puppet.fileextension]
then
bash path/to/system2/puppet.fileextension
fi
}
runPuppet apply x.pp
并将 runPuppet
输入更改为您想要的任何内容。
至clarify/explain:
-e
是检查文件是否存在
</code> & <code>
分别是前两个输入参数。
也许 PATH
的导出有误?
export PATH=$PATH:/usr/test/bin/puppet
.bash_profile
仅当 bash 作为登录 shell(bash -l
或来自真实的 tty)被调用时才会加载,至少在基于 Debian 的发行版中是这样 bash 在虚拟 tty 中(例如使用 xterm
、gnome-terminal
等时)被调用为交互式 shell.
Interactive shells 从 ~/.bashrc
.
加载配置
bash 联机帮助页:
~/.bash_profile
The personal initialization file, executed for login shells
~/.bashrc
The individual per-interactive-shell startup file
Shellscripts 不加载任何这些。
您可以使用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
脚本(子进程将继承环境变量)以保证用户可以 运行 来自不同环境的脚本和 shells(除了 bash 之外的一些 bourne 兼容 shells加载 ~/.profile
)
我的 Linux 盒子上安装了一个名为 puppet 的应用程序。它安装在位置 /usr/test/bin/puppet
这就是 .bash_profile
的样子
export PATH=/usr/test/bin
如果我从控制台运行命令 puppet apply
,它工作正常,但是当我从 bash 脚本内部调用 puppet
命令时,它说找不到命令
#!/bin/bash
puppet apply x.pp
有什么问题吗?
您可以尝试使用 alias
,像这样
在你的.bash_profile
中:
alias puppet='bash puppet.fileextension'
你也可以
alias puppet='bash path/to/puppet.fileextension'
这将使您 运行 从终端中的任何地方运行脚本。
编辑:
OP在评论中说会有两个不同的系统运行ning,他问如何检查bash文件的文件路径。
如果你这样做
#!/bin/bash
runPuppet(){
if [ -e path/to/system1/puppet.fileextension]
then
bash path/to/system1/puppet.fileextension
elif [ -e path/to/system2/puppet.fileextension]
then
bash path/to/system2/puppet.fileextension
fi
}
runPuppet apply x.pp
并将 runPuppet
输入更改为您想要的任何内容。
至clarify/explain:
-e
是检查文件是否存在
</code> & <code>
分别是前两个输入参数。
也许 PATH
的导出有误?
export PATH=$PATH:/usr/test/bin/puppet
.bash_profile
仅当 bash 作为登录 shell(bash -l
或来自真实的 tty)被调用时才会加载,至少在基于 Debian 的发行版中是这样 bash 在虚拟 tty 中(例如使用 xterm
、gnome-terminal
等时)被调用为交互式 shell.
Interactive shells 从 ~/.bashrc
.
bash 联机帮助页:
~/.bash_profile
The personal initialization file, executed for login shells
~/.bashrc
The individual per-interactive-shell startup file
Shellscripts 不加载任何这些。
您可以使用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
脚本(子进程将继承环境变量)以保证用户可以 运行 来自不同环境的脚本和 shells(除了 bash 之外的一些 bourne 兼容 shells加载~/.profile
)