bash - shell脚本中通配符*的奇怪行为

标签 bash shell echo wildcard zsh

在我的 shell 脚本中有以下代码

echo * | tr ' ' '\n'

在这里我注意到虽然我使用的是 * ,但它正在跳过隐藏文件 (.*) 之后我尝试了一个明显的改变

echo .* | tr ' ' '\n'

这解决了我的隐藏文件问题。但我只是对 *

的这种奇怪行为感到好奇

因为.*是*的子集
的理想输出

  1. echo * -> 所有文件包括隐藏文件

  2. echo .* -> 所有隐藏文件

  3. 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/

相关文章:

php - 在 PHP 中回显 HTML

javascript - 如何获取PHP echo问号后的值

linux - 打开终端以发出一个命令

batch-file - 使用带有特殊字符的批处理回显

bash - 自动 git clone 到唯一的目标目录

linux - 从 bash 脚本获取用户输入(由 cron 或 udev 执行)

bash - 计算距离特定日期还剩多少天

bash - 试图在 bash shell 中捕获 javac 输出

file - 区分两个文件并只保留新的或更改的行

git - 运行docker命令时出现bash语法错误