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

问题描述

我知道当您在 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. 有什么方法可以表明这种情况正在发生?

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

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

提前致谢。 完成

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)