检查是否定义了函数

时间:2014-08-21 15:28:30

标签: bash function shell

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

#!/bin/bash
if  type rbenv | grep -q "rbenv is a function" ;
then
  echo "success!"
else
  echo "something went wrong."
fi

我无法让这个为我工作,这个脚本的结果是something went wrong.我希望这个工作正常,并且可能知道是否有更好的解决方案来完成这项任务。 />
我也试过这个版本的脚本但没有成功。

if  [[ $(type rbenv | head -1) == "rbenv is a function" ]] ;
...

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

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

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

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

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

4 个答案:

答案 0 :(得分:5)

我的预感是你还没有导出你的功能。尝试

export -f rbenv

在运行脚本之前。这将使该函数对子shell可见,例如在运行shell脚本时启动的子shell。

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

此外,您的代码可以更加强大。邮件的输出格式可能会在下一次Bash升级中发生变化,或者您最终可能会在某天将Bash本地化为其他语言。

case $(type -t rbenv) in
    function) echo Success;;
    *) echo Something went wrong;;
esac

(从if testcase的变化只是个人成语/传福音,而不是一个重要的修改。)

答案 1 :(得分:1)

完整的解决方案

显然,我需要的是重复安装rbenv的步骤,因为它要放在我的{if语句行之前“{ {1}}在Ubuntu桌面上或~/.bashrc在Zsh shell中或~/.zshrc在任何其他Linux风格中使用Bash

~/.bash_profile

只有这样它才会将完整的export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)" 脚本加载到我的rbenv安装脚本中,我可以检查它是否是

的功能
rbenv

如tripleee所建议的那样,更好的方法是在if语句中使用if type rbenv | grep -q "rbenv is a function" ; then echo "success!" else echo "something went wrong." fi 。我不是贝壳黑客,但似乎有些更加机智和可重复使用。

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

答案 2 :(得分:0)

  

好的,但在我的情况下,我想从我的脚本中导出此函数,该脚本是单独的rbenv脚本,是从我的脚本导出的输出是./rbenv_check:第2行:export:rbenv:不是函数,所以我不能在我的脚本中做到这一点,但我想在这里完成这个。我的想法是,当安装rbenv时,函数可能会保留在脚本中,然后我才能从这个脚本中检查这个,但是我已经开始写这个检查了,所以我一定会确保一切正确。

这不是您最初的问题的答案,而是关于尝试从shell脚本中导出您的函数。

导出告诉您的shell将该项目复制到后续命令中。由于您的shell脚本已经是子shell,因此您的函数不存在。它已经消失了。不再。你有两个选择:

  • 简单方法:在运行shell脚本之前导出函数。
  • 困难的方法:这需要一些设置:

我认为你的函数是在你登录时执行的某个文件中定义的。获取你想要的所有这些函数,并将它们放在另一个文件中。我们说$HOME/.functions

现在,在后续shell脚本中需要这些功能的任何地方, source 在shell脚本中的那个文件:

if [[ -x $HOME/.functions ]]
then
    source $HOME/.functions
else
    echo "ERROR: The $HOME/.functions function definitions are missing." >&2
    echo "ERROR: This script is exiting." >&2
    exit 2
fi

您也可以在$HOME/.bash_profile文件中添加以下行,以便在默认shell中使用这些功能。

[[ -x $HOME/.functions ]] && source $HOME/.functions

请注意,我只是找到了函数的来源,并且不打印出错误消息并退出。您不希望在.bash_profile脚本中执行此操作。否则,一个错误,您将无法登录。

答案 3 :(得分:0)

定义了功能的两种方法

方法1:

if [ `type -t rbenv` = "function" ];
then echo "'rbenv' is     a function"
else echo "'rbenv' is not a function"
fi

方法2:

if `declare -F rbenv`; then echo "'rbenv' is     a function"
                       else echo "'rbenv' is not a function"
fi