我想弄清楚BASH man page tab completion script顶部的某段代码如何工作:
[[ $OSTYPE == *@(darwin|freebsd|solaris|cygwin|openbsd)* ]] || _userland GNU \
|| return 1
我相信这是一个守卫;如果BASH特殊变量$OSTYPE
不包含括号内包含的(基本常规?)表达式中的一个字符串,或者如果userland是GNU则它将停止执行脚本。但是,我无法理解语法是如何工作的或它意味着什么,我不知道控制流是什么。
您可以找到_userland
here的定义:
# Check if we're running on the given userland
# @param $1 userland to check for
_userland()
{
local userland=$( uname -s )
[[ $userland == @(Linux|GNU/*) ]] && userland=GNU
[[ $userland == $1 ]]
}
这个功能如何运作?它会返回一个值吗?
如果您可以提供相关文档或文章的参考,那将会有所帮助。谢谢。
答案 0 :(得分:1)
在c1 || c2 || c3 || ...
链中,将尝试每个命令直到一个成功。成功执行命令后,链中的其余命令将不会执行。
所以在这个命令链中:
[[ $OSTYPE == *@(darwin|freebsd|solaris|cygwin|openbsd)* ]] \
|| _userland GNU \
|| return 1
如果OSTYPE
是darwin,freebsd等之一,那么链就会停止。您可以在man bash
中详细了解此处使用的模式,搜索模式匹配。在此示例中,适用的规则是:
@(pattern-list) Matches one of the given patterns
模式由|
分隔。 *
周围的@(...)
表示这些模式可以出现在OSTYPE
内的任何位置。只有@(...)
表示与给定模式完全匹配,@(...)*
意味着从任何给定模式开始,*@(...)
意味着以任何给定模式结束。
如果OSTYPE
没有匹配,我们会尝试链中的下一个项目:_userland GNU
。如果成功,那么链条会停止。否则,我们尝试链中的下一个项目return 1
,因此我们退出该函数。
_userland
函数执行:
local userland=$( uname -s )
:将uname -s
命令的输出存储在名为userland
[[ $userland == @(Linux|GNU/*) ]] && userland=GNU
:如果值为Linux
或以GNU/
开头,则设置userland=GNU
[[ $userland == $1 ]]
:将值与我们收到的参数进行比较。此比较的退出代码是函数的返回值。如果值匹配,则表示成功。