当我输入时,我有一个简单的脚本来检查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 -)"
我要感谢参与讨论的每个人指导我完成解决方案:)
答案 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 test
到case
的变化只是个人成语/传福音,而不是一个重要的修改。)
答案 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,因此您的函数不存在。它已经消失了。不再。你有两个选择:
我认为你的函数是在你登录时执行的某个文件中定义的。获取你想要的所有这些函数,并将它们放在另一个文件中。我们说$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