Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从bash脚本内部调用时未找到命令_Linux_Bash_Puppet - Fatal编程技术网

Linux 从bash脚本内部调用时未找到命令

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=

我的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='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
    是应该找到的文件,而不是用来查找二进制文件的目录。