如何确认通配符模式中是否转义了空格或特殊字符?

How can I confirm whether whitespace or special characters are escaped in a wildcard pattern?

我知道当你在 Bash 中使用 for 循环时,你循环的项目是使用 $IFS 变量分隔的。

但是,如果我 运行 以下命令,我会正确显示我创建的两个文件 - 即使它们有空格:

touch file\ {1..2}.txt
for file in *.txt; do
    echo "Found: ${file}"
done

输出为:

Found: file 1.txt
Found: file 2.txt

假设这是因为当shell看到通配符模式时,它会扩展它并转义任何特殊字符或空格。这与如果我 运行:

touch file\ {1..2}.txt
files=$(ls *.txt)
for file in $files; do
    echo "Found: ${file}"
done

这导致:

Found: file
Found: 1.txt
Found: file
Found: 2.txt

这是有道理的 - 默认情况下 $IFS 包含空格,因此文件名是分开的。

我想了解的是:

  1. 我是否纠正了通配符扩展导致一组包含 转义 特殊字符
  2. 的字符串
  3. 如果我是正确的,这种情况是在哪里记录的?
  4. 有什么方法可以显示这正在发生吗?

我希望我可以使用 set -x 之类的东西来显示通配符扩展到的内容并实际看到转义字符,因为我真的希望能够理解这里发生的事情。

我正在写一系列关于有效 shell 用法(有效-shell.com)的文章,我正在努力寻找一种方法来解释这里的行为差异,我是假设 shell 正在转义字符,但我想知道是否是这种情况以及如何 查看 如果可能的话!

提前致谢。 完成

  1. Am I correct that wildcard expansion results in a set of strings that contain escaped special characters

没有。此时 shell 不需要转义特殊字符,因为文件名扩展是要执行的最后一个单词扩展;由此产生的字符串不受单词拆分或任何其他扩展的影响;他们保持原样。这在 the manual 中记录如下:

The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and filename expansion.