为什么我不在bash中启用extglob?
我刚刚在这里发现了bash extglob shell选项:- 所有使用为什么我不在bash中启用extglob?,bash,Bash,我刚刚在这里发现了bash extglob shell选项:- 所有使用shopt-s extglob的答案也提到了shopt-u extglob关闭它。 我为什么要关掉这么有用的东西?事实上,为什么默认情况下它没有打开? 据推测,它可能会带来一些令人不快的惊喜。 它们是什么?没有令人不快的惊喜——默认关闭行为只是为了与传统的、符合标准的模式语法兼容 这就是说:有可能(尽管不太可能)有人编写了fo+(o)。*实际上打算将++和括号视为与其代码匹配的模式的文字部分。对于bash来说,以与POS
shopt-s extglob
的答案也提到了shopt-u extglob
关闭它。
我为什么要关掉这么有用的东西?事实上,为什么默认情况下它没有打开?
据推测,它可能会带来一些令人不快的惊喜。
它们是什么?没有令人不快的惊喜——默认关闭行为只是为了与传统的、符合标准的模式语法兼容
这就是说:有可能(尽管不太可能)有人编写了
fo+(o)。*
实际上打算将++
和括号视为与其代码匹配的模式的文字部分。对于bash来说,以与POSIX sh规范所要求的不同的方式来解释这个表达式将是破坏兼容性,这是目前在极少数情况下默认完成的(echo-e
,其中xpg_echo
unset是唯一一个立即想到的方法)
这与bash扩展扩展扩展POSIX标准未定义的行为的常见情况不同——基线POSIX shell通常会抛出错误,但是bash提供了一些新的和不同的显式记录行为——因为POSIX定义了将这些字符视为匹配的需要
引述如下,并加上重点:
一个普通的字符是一个模式,应该匹配自己。它可以是支持的字符集中的任何字符,但NUL、中需要引号的特殊shell字符以及以下三个特殊模式字符除外。匹配应基于用于编码字符的位模式,而不是字符的图形表示。如果引用任何字符(普通、特殊外壳或特殊图案),则该图案应与字符本身匹配。shell特殊字符总是需要引用
当无引号且在括号表达式之外时,以下三个字符在图案规范中应具有特殊含义:
-问号是与任何字符匹配的模式?
-星号是一种模式,应匹配多个字符,如中所述*
-开放式括号应引入模式括号表达式[
?
、*
或[
或其他地方列出的需要引用以匹配自身的字符以外的任何非NUL字符。Bash默认关闭extglob的行为允许其在默认配置中符合该标准
但是,对于您自己的脚本和您自己的交互式shell,除非您养成了运行为POSIX sh编写的代码并包含异常模式的习惯,否则启用
extglob
通常是值得的。作为一个Kornshell人,我的中默认启用了extglob
。bashrc
,因为它就是这样在科恩希尔,我经常使用它
例如:
$ find !(target) -name "*.xml"
在Kornshell中,这没有问题。在BASH中,我需要设置extglob
。我还设置lithist
和set-o vi
。这允许我在使用shell历史记录时使用vi命令,当我点击v
时,它将我的代码显示为一组行
无lithist
设置:
for i in *;do;echo "I see $i";done
for i in *
do
echo "I see $i"
done
设置<代码>列表历史时:
for i in *;do;echo "I see $i";done
for i in *
do
echo "I see $i"
done
现在,只要BASH有
print
语句,我就可以准备好了。在我的.bashrc中设置是如此值得/安全?BASH首选的echo替代品是略微扩展的printf
,ksh也有…@charlesduff是的,我知道printf
。我的问题是习惯。从那时起我就一直在写Kornshell脚本上世纪80年代。习惯上说,当我在命令行上编写一个快速shell脚本时,使用print
而不是echo
。BASH和KSH大约98%兼容。这足以让我发疯。我可以在各种语言之间切换,而不必思考,因为语法不同。BASH与KSH非常相似,我忘了我正在使用BASH而不是KSH。然后我尝试了一个Kornism,比如rvi
或cd foo bar
,BASH高兴地拒绝了它。Grrrr…@DavidW。-我在几年前转换了它,在我的脚本库移植之前,我有很多与bug兼容的kshism实现为函数-print
,从哪里来的
,等等。但我早就放弃了扩展的表现力让我想知道我是如何使用r
/fc
@MarkReed的。我非常依赖BASH所称的extglobs,因此BASH-Bang不仅是我不使用的东西,而且是我一直遇到的令人沮丧的不兼容问题之一。说删除所有东西真是太好了是的,我可以设置shopt-s extglob
,我还可以设置lithist
,这与ksh编辑我经常使用的多行命令的方式不太兼容。我只是一只恐龙,看着哺乳动物慢慢接管。想到这一点,我很沮丧,现在我需要一些icE u霜和回忆关于UUCp和USENET.@ DavidW。我们可以通过电子邮件继续这一点。我在OLDFART!MJRID…..)要考虑的是,在你的个人配置文件配置未被应用的情况下,习惯于在你的配置文件中启用这一点会导致一些混乱。(重建的机器、可能在其他机器上运行的shell脚本等)。坚持使用默认值有一些好处。但是,这绝对是一个保守的观点。您的里程可能会有所不同。