Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我不在bash中启用extglob?_Bash - Fatal编程技术网

为什么我不在bash中启用extglob?

为什么我不在bash中启用extglob?,bash,Bash,我刚刚在这里发现了bash extglob shell选项:- 所有使用shopt-s extglob的答案也提到了shopt-u extglob关闭它。 我为什么要关掉这么有用的东西?事实上,为什么默认情况下它没有打开? 据推测,它可能会带来一些令人不快的惊喜。 它们是什么?没有令人不快的惊喜——默认关闭行为只是为了与传统的、符合标准的模式语法兼容 这就是说:有可能(尽管不太可能)有人编写了fo+(o)。*实际上打算将++和括号视为与其代码匹配的模式的文字部分。对于bash来说,以与POS

我刚刚在这里发现了bash extglob shell选项:-

所有使用
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脚本等)。坚持使用默认值有一些好处。但是,这绝对是一个保守的观点。您的里程可能会有所不同。