在bash,如果你这样做:有一种简单的方法来设置对了nullglob一个水珠
mkdir /tmp/empty
array=(/tmp/empty/*)
你发现array
现在有一个元素,"/tmp/empty/*"
,不为零,只要你愿意。值得庆幸的是,这可以通过打开使用了nullglob外壳选项可以避免shopt -s nullglob
不过了nullglob是全球性的,编辑现有的shell脚本时,可能会打破东西(例如,没有人检查ls foo*
退出代码来检查是否有是以“foo”开头的文件吗?)。所以,理想情况下,我只想将它打开一个小范围 - 理想情况下,一个文件名扩展。你可以关闭它再次使用shopt -u nullglob
不过,当然,只有当它被禁用前:
old_nullglob=$(shopt -p | grep 'nullglob$')
shopt -s nullglob
array=(/tmp/empty/*)
eval "$old_nullglob"
unset -v old_nullglob
让我觉得必须有一个更好的办法。显而易见的“将它放在子外壳中”并不适用,因为变量赋值与子外壳一起死亡。除了导入ksh93语法的waiting for the Austin group,有吗?
这很不错。如果文件名中有换行符,它会失败,但尽管允许,但这种情况非常罕见。只要文件名不受攻击者控制。 – derobert 2013-12-14 15:09:52
是的,文件名中的换行符确实存在。通常情况下,这只意味着“找到罪魁祸首并惩罚他/她”。除了我唯一一次看到文件名中的换行符,罪魁祸首是一位迷人的老太太...... – mivk 2013-12-23 19:29:11