【发布时间】:2018-11-18 14:24:45
【问题描述】:
我一直试图理解为什么 Bash 会以我想要的方式解析以下内容,而不是我通过阅读 Bash 参考手册 (https://www.gnu.org/software/bash/manual/) 所期望的方式。从该手册中,我了解到通配符(例如第一行包含)在执行命令之前通过文件名扩展进行处理。但是,第二个 for 循环包含另一个通配符。如果在命令行处理时对其进行评估,它将与子目录中的文件不匹配。但这正是它的行为方式。直到运行时,在 cd 命令完成后,才会评估第二个通配符。 Bash 是如何做到这一点的?我想这是对命令行的非常纠结的评估。
for d in *;do
cd "$d"
for f in *.zip; do
7z x "$f"
done
cd ..
done
【问题讨论】:
-
通配符扩展对 bash 执行的每个(子)命令分别进行。
-
这还不清楚。扩展发生在执行之前的命令评估期间。那么,您是说子命令是外部 for 循环中的所有内容吗? *.zip 扩展必须在外部 for 循环的每次迭代中以及 cd 命令完成后进行。这似乎与手册不一致。
-
@KevinBuchs 对于简单命令而不是复合命令是正确的,请参阅 3.2 Shell 命令,请注意,其他 posix shell 也是如此pubs.opengroup.org/onlinepubs/009695399/utilities/…