检查是否定义了功能

Szy*_*ski 3 bash shell function

rbenv当我键入以下内容时,我有一个简单的脚本来检查是否为函数: $ type rbenv | grep "rbenv is a function" 进入外壳,得到肯定的结果,外壳响应为。rbenv is a function 然后,我想在脚本中执行此操作,因此在文件中编写:

#!/bin/bash
if  type rbenv | grep -q "rbenv is a function" ;
then
  echo "success!"
else
  echo "something went wrong."
fi
Run Code Online (Sandbox Code Playgroud)

我无法为我工作,此脚本的结果是something went wrong.我想让它正常工作,并且也许知道是否有更好的解决方案可以完成此任务。

我也尝试过此版本的脚本,但没有成功。

if  [[ $(type rbenv | head -1) == "rbenv is a function" ]] ;
...
Run Code Online (Sandbox Code Playgroud)

type rbenv | head -1在shell中编写会输出rbenv is a function。我不知道自己在做什么错,请指出我的错误。

解决此问题的部分方法export -f rbenv在运行脚本之前在外壳中运行,但这不是正确的方法吗?

完全解决方案显然,我需要从安装rbenv重复我的步骤,因为它要放在if语句之前:

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
Run Code Online (Sandbox Code Playgroud)

我要感谢参与讨论的每个人都指导我完成解决方案:)

tri*_*eee 6

我的直觉是您尚未导出函数。尝试

export -f rbenv
Run Code Online (Sandbox Code Playgroud)

在运行脚本之前。这将使该功能对子Shell可见,例如在运行Shell脚本时启动的子Shell。

根据您要完成的工作,更好的解决方案可能是将代码定义为您自己.bashrc或类似人的函数,而不是单独的脚本。

另外,可以使您的代码更健壮。在下一次Bash升级中,消息的输出格式可能会更改,或者有一天您可能最终会使用本地化为另一种语言的Bash。

case $(type -t rbenv) in
    function) echo Success;;
    *) echo Something went wrong;;
esac
Run Code Online (Sandbox Code Playgroud)

(从if test到的更改case只是个人成语/布道,不是关键的修改。)