首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有为一个glob设置nullglob的简单方法?

有没有为一个glob设置nullglob的简单方法?
EN

Stack Overflow用户
提问于 2012-02-03 17:02:10
回答 4查看 9.1K关注 0票数 26

在bash中,如果您这样做:

代码语言:javascript
复制
mkdir /tmp/empty
array=(/tmp/empty/*)

您会发现array现在只有一个元素"/tmp/empty/*",而不是您想要的零。值得庆幸的是,这可以通过使用shopt -s nullglob打开nullglob shell选项来避免

ls foo*是全局的,在编辑现有的shell脚本时,可能会破坏某些内容(例如,是否有人检查了nullglob的退出代码,以检查是否存在以“foo”开头的文件?)。所以,理想情况下,我只想在很小的范围内启用它-理想情况下,一个文件名扩展。您可以使用shopt -u nullglob再次关闭它,但当然只有在之前禁用它的情况下:

代码语言:javascript
复制
old_nullglob=$(shopt -p | grep 'nullglob$')
shopt -s nullglob
array=(/tmp/empty/*)
eval "$old_nullglob"
unset -v old_nullglob

这让我觉得一定有更好的办法。显而易见的“放在subshell中”是行不通的,因为变量赋值与subshell一起消失了。除了waiting for the Austin group还可以导入ksh93语法吗?

EN

回答 4

Stack Overflow用户

发布于 2012-02-03 23:13:43

完成后取消设置:

代码语言:javascript
复制
shopt -u nullglob

并且适当地(即存储先前的状态):

代码语言:javascript
复制
shopt -u | grep -q nullglob && changed=true && shopt -s nullglob
... do whatever you want ...
[ $changed ] && shopt -u nullglob; unset changed
票数 17
EN

Stack Overflow用户

发布于 2016-01-23 06:53:13

这只比你最初的建议好一点:

代码语言:javascript
复制
local nullglob=$(shopt -p nullglob) ; shopt -s nullglob

..。做你想做的..。

代码语言:javascript
复制
$nullglob ; unset nullglob
票数 7
EN

Stack Overflow用户

发布于 2012-02-03 22:02:06

这可能接近您想要的结果;实际上,它需要执行一个命令来展开glob。

代码语言:javascript
复制
$ ls
file1 file2
$ array=( $(shopt -s nullglob; ls foo*) )
$ ls foo*
ls: foo*: No such file or directory
$ echo ${array[*]}
file1 file2

我们没有在子subshell中设置array,而是使用$()创建了一个子subshell,其输出由array捕获。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9126060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档