在我的 shell 脚本中有以下代码
echo * | tr ' ' '\n'
在这里我注意到虽然我使用的是 * ,但它正在跳过隐藏文件 (.*) 之后我尝试了一个明显的改变
echo .* | tr ' ' '\n'
这解决了我的隐藏文件问题。但我只是对 *
的这种奇怪行为感到好奇因为.*是*的子集
的理想输出
echo * -> 所有文件包括隐藏文件
echo .* -> 所有隐藏文件
echo [^.]* -> 所有非隐藏文件(currently echo *)
因此 echo * 的行为类似于 echo [^.]*
如何使用 echo 获取包括隐藏文件在内的完整文件列表。 ls 和 dir 的输出类似,尽管 ls -a 给出了理想的输出
最佳答案
shell glob *
被定义为忽略隐藏文件,因此按预期工作。 .*
将仅展开为隐藏文件。
一些 shell 允许通过一个选项改变这个行为。例如。 zsh
允许 setopt dotglob
成为不符合标准的(对 POSIX)以及默认的 glob 点文件。对于 bash,您可以使用 shopt -s dotglob
。但请注意,脚本可能会出现故障,因为它们通常假设通配符采用 POSIX 行为。
获取所有文件的最佳做法是不要使用带通配符的 echo,例如 find 。 -maxdepth 1
(如果你对 echo 绝望,也许 echo * .*
会做,但如果任何一个 glob 不匹配任何文件,它就会有问题,在这种情况下,glob 模式可以保留)。
关于bash - shell脚本中通配符*的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15106347/