在bash中,如果您这样做:
mkdir /tmp/empty
array=(/tmp/empty/*)
您会发现array
现在只有一个元素"/tmp/empty/*"
,而不是您想要的零。值得庆幸的是,这可以通过使用shopt -s nullglob
打开nullglob shell选项来避免
但ls foo*
是全局的,在编辑现有的shell脚本时,可能会破坏某些内容(例如,是否有人检查了nullglob的退出代码,以检查是否存在以“foo”开头的文件?)。所以,理想情况下,我只想在很小的范围内启用它-理想情况下,一个文件名扩展。您可以使用shopt -u nullglob
再次关闭它,但当然只有在之前禁用它的情况下:
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语法吗?
发布于 2012-02-03 23:13:43
完成后取消设置:
shopt -u nullglob
并且适当地(即存储先前的状态):
shopt -u | grep -q nullglob && changed=true && shopt -s nullglob
... do whatever you want ...
[ $changed ] && shopt -u nullglob; unset changed
发布于 2016-01-23 06:53:13
这只比你最初的建议好一点:
local nullglob=$(shopt -p nullglob) ; shopt -s nullglob
..。做你想做的..。
$nullglob ; unset nullglob
发布于 2012-02-03 22:02:06
这可能接近您想要的结果;实际上,它需要执行一个命令来展开glob。
$ 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
捕获。
https://stackoverflow.com/questions/9126060
复制相似问题