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)
我要感谢参与讨论的每个人都指导我完成解决方案:)
我的直觉是您尚未导出函数。尝试
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只是个人成语/布道,不是关键的修改。)