ash 是否有相当于 bash 的“nullglob”的功能?选项?
如果 glob 模式与任何文件都不匹配,bash
将仅返回文字模式:
bash-4.1# echo nonexistent-file-*
nonexistent-file-*
bash-4.1#
您可以通过设置 nullglob
shell 选项来修改默认行为,这样如果没有匹配的内容,你得到一个空字符串:
bash-4.1# shopt -s nullglob
bash-4.1# echo nonexistent-file-*
bash-4.1#
那么 ash
中是否有等效的选项?
bash-4.1# ash
~ # echo nonexistent-file-*
nonexistent-file-*
~ # shopt -s nullglob
ash: shopt: not found
~ #
If a glob pattern doesn't match any files, bash
will just return the literal pattern:
bash-4.1# echo nonexistent-file-*
nonexistent-file-*
bash-4.1#
You can modify the default behavior by setting the nullglob
shell option so if nothing matches, you get a null string:
bash-4.1# shopt -s nullglob
bash-4.1# echo nonexistent-file-*
bash-4.1#
So is there an equivalent option in ash
?
bash-4.1# ash
~ # echo nonexistent-file-*
nonexistent-file-*
~ # shopt -s nullglob
ash: shopt: not found
~ #
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对于没有
nullglob
的 shell,例如 ash 和 dash:来源: Shell 中的文件名和路径名:如何正确执行 (缓存)
For shells without
nullglob
such as ash and dash:Source: Filenames and Pathnames in Shell: How to do it correctly (cached)
此方法比每次迭代检查是否存在更高效:
我们使用
set
将通配符扩展到 shell 的参数列表中。请注意,这将覆盖最初传递给脚本的任何位置参数($1
、$2
、...)。即使全局模式以可能与其他冲突的
用法。+
或-
字符开头,特殊参数--
也能使其正常工作。否则设置如果参数列表的第一个元素不存在,则 glob 不匹配任何内容。与将第一个结果与逐字 glob 模式进行比较不同,即使 glob 的第一个匹配项与 glob 模式相同的文件名也能正常工作。
如果不匹配,则参数列表包含单个元素,我们将其移走,以便参数列表现在为空。那么
for
循环将根本不会执行任何迭代。否则,当变量名后面没有任何内容时(相当于“$@”中的
),我们会循环遍历 glob 扩展成的参数列表,使用
for
的隐式行为code>,迭代所有位置参数)。This method is more performant than checking existence every iteration:
We use
set
to expand the wildcard into the shell's argument list. Note this will overwrite any positional arguments ($1
,$2
, ...) originally passed to the script. The special argument--
makes it work even if the glob pattern would start with a+
or-
character that could conflict with otherset
usages otherwise.If the first element of the argument list does not exist, the glob didn't match anything. Unlike comparing the first result with the verbatim glob pattern, this works correctly even if the glob's first match was on a filename identical to the glob pattern.
In case of no match, the argument list contains a single element, and we shift it off, so that the argument list is now empty. Then the
for
loop will not perform any iterations at all.Otherwise, we loop over the list of arguments which the glob expanded into, using the implicit behavior of
for
when there is nothing after the variable name (being equivalent toin "$@"
, iterating through all positional arguments).