Linux 从bash脚本内部调用时未找到命令
我的Linux机器上安装了一个名为puppet的应用程序。它安装在位置Linux 从bash脚本内部调用时未找到命令,linux,bash,puppet,Linux,Bash,Puppet,我的Linux机器上安装了一个名为puppet的应用程序。它安装在位置/usr/test/bin/puppet 这就是.bash\u profile的外观 export PATH=/usr/test/bin 若我从控制台运行命令puppet apply,它工作正常,但当我从bash脚本内部调用puppet命令时,它会说找不到命令 #!/bin/bash puppet apply x.pp 有什么问题吗?您可以尝试使用别名,如下所示 在您的.bash\u配置文件中: alias puppet=
/usr/test/bin/puppet
这就是.bash\u profile
的外观
export PATH=/usr/test/bin
若我从控制台运行命令puppet apply
,它工作正常,但当我从bash脚本内部调用puppet
命令时,它会说找不到命令
#!/bin/bash
puppet apply x.pp
有什么问题吗?您可以尝试使用
别名,如下所示
在您的.bash\u配置文件中
:
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
分别是前两个输入参数。可能是路径的导出错误
export PATH=$PATH:/usr/test/bin/puppet
.bash_profile
仅当bash作为登录shell调用(bash-l
或从真实的tty调用时才会加载,至少在基于Debian的发行版中,虚拟tty中的bash(例如当使用xterm
时,gnome终端
等)作为交互式shell调用
交互式Shell从~/.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
中的路径(子进程将继承环境变量),以保证用户可以从不同的环境和shell运行脚本(除bash之外的一些bourne兼容Shell不加载~/.profile
)
这可能是一个更好的问题。是否确定路径正确,请运行where is puppet
。在运行此脚本的同一控制台上,再次导出路径并检查。可能此shell已在路径中,但最初未导出路径。where is puppet:/etc/puppet@Gary:那么您应该将/etc
包含在路径…你最好附加到路径:…=$path:/etc
,这样旧的路径引用就不会在这个过程中丢失。Quill:wq,谢谢你的回复。有两个系统可以让人们运行这个脚本。在一种类型的系统上,应用程序安装在/usr/bin,并识别puppet命令-一切都很顺利,但如果people在第二个系统上运行这个脚本,应用程序安装在/usr/test/bin上,然后我们看到这个问题,这就是为什么我没有提到脚本中的任何路径,因为我不知道他们将在哪个系统上运行这个脚本。知道吗?我们说的是什么样的系统,操作系统,还是一般用户偏好?只有1个参数eter,apply不是一个参数,这是puppet命令的一部分,patameter只是一个x.pp,这听起来不错,感谢QuillNo担心,但参数是用于处理puppet的,如果你只想调用apply,那么就好了,但除此之外,基本上就像用你在puppet之后放置的东西替换$1
$2
。嗨,请你再详细说明一下,我应该对bashrc进行更改吗?我没有使用strace的经验,你能告诉我如何在我的问题中使用它吗?谢谢Fernando,它成功了。如果puppet安装在默认的/usr/bin目录中,而我的脚本中还有export/usr/test/bin和/usr/bin。它会尝试在bo中找到该命令吗th/usr/bin和/usr/test/bin?在某个时间点,应用程序将位于/usr/bin或/usr/test/bin中。谢谢again@Gary最好的解决方案是在/usr/local/bin
上安装puppet,如果这样做,则无需修改PATH环境变量不同的文件夹,它在两个系统上都起作用。祝你好运,谢谢,因为puppet
是应该找到的文件,而不是用来查找二进制文件的目录。