从bash脚本内部调用时没有find命令

我有一个名为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(例如,当使用xtermgnome-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 

可能的解决方案:

  1. 您可以在每个脚本的开头导出变量:

     #!/bin/bash export PATH=$PATH:... 
  2. 或者你可以使用其他文件,并使用所需的变量,并从任何需要这些变量的脚本获取它:

    /etc/special_vars.sh:

     export PATH=$PATH:... 

    脚本:

     #!/bin/bash . /etc/special_vars.sh puppet ... 
  3. ~/.bashrc~/.bash_profile~/.profile为运行脚本的用户(子进程将继承环境变量)配置PATH ,以保证用户可以从不同的环境运行脚本shell(bash之外的一些bourne兼容shell加载~/.profile

也许PATH的出口是错误的?

 export PATH=$PATH:/usr/test/bin/puppet