Terminal 全球模式不';t在zsh中展开内部文件

Terminal 全球模式不';t在zsh中展开内部文件,terminal,zsh,Terminal,Zsh,我正在尝试从全局中排除目录 这在命令行中起作用: $ export exclude=BigDir $ for d in ^$exclude/ ; do echo "$d" ; done SmallDir/ SmallerDir/ $ 但在文件中,它根本不起作用 #!/bin/zsh exclude=BigDir for d in ^$exclude/ ; do echo "$d" ; done 运行/test或以我保存的方式打印文本字符串 如何使其在脚本文件中正确展开?您错误地使用了she

我正在尝试从全局中排除目录

这在命令行中起作用:

$ export exclude=BigDir
$ for d in ^$exclude/ ; do echo "$d" ; done
SmallDir/
SmallerDir/
$
但在文件中,它根本不起作用

#!/bin/zsh

exclude=BigDir
for d in ^$exclude/ ; do echo "$d" ; done
运行
/test
或以我保存的方式打印文本字符串


如何使其在脚本文件中正确展开?

您错误地使用了shell使用的全局字符
,正则表达式构造
^
$
。示例中的
for
循环不能进行正则表达式匹配以排除提供的目录,因为它只进行路径名扩展(又称.glob扩展)

除非您让shell通过在
bash
中启用扩展glob选项
extglob
zsh
中启用扩展glob选项
extglob
来将
^
$
视为特殊,否则您无法实现您想要做的事情

所以你可能只需要

setopt extendedglob
print -rl ^BigDir*

意思是打印除与
BigDir
匹配的文件名之外的任何内容您错误地使用了shell使用的全局字符
,正则表达式构造
^
$
。示例中的
for
循环不能进行正则表达式匹配以排除提供的目录,因为它只进行路径名扩展(又称.glob扩展)

除非您让shell通过在
bash
中启用扩展glob选项
extglob
zsh
中启用扩展glob选项
extglob
来将
^
$
视为特殊,否则您无法实现您想要做的事情

所以你可能只需要

setopt extendedglob
print -rl ^BigDir*

意思是除了与
BigDir

匹配的文件名之外,打印任何内容,默认的shell是哪个
bash
zsh
?您已在中为后者定义了解释器script@Inianzsh是我的默认shell哪个shell是你的默认shell
bash
zsh
?您已在中为后者定义了解释器script@Inianzsh是我的默认值我实际上根本不理解这个答案,但将
setopt extendedglob
放在脚本文件的顶部修复了我的问题。@唯一的原因是配置文件中可能有
setopt extendedglob
,因此,该选项已在交互式shell中启用。该选项不是由脚本运行的shell继承的,这就是为什么需要在脚本中显式打开该选项的原因。我实际上根本不理解这个答案,但是将
setopt extendedglob
放在脚本文件的顶部修复了我的问题。@onlygusti您可能在某个配置文件中有
setopt extendedglob
,因此该选项已在交互式shell中启用。该选项不会被脚本运行的shell继承,这就是为什么需要在脚本中显式打开该选项的原因。