"set -f" 在 bash 不工作

"set -f" in bash not working

相关:Stop shell wildcard character expansion?

我过去曾在 bash 中使用 set -f 来防止 glob 扩展 - 但是这似乎不再适用于我的 mac:

$ cat script.sh
#!/bin/bash

echo [=12=]

i=1
for var in $@
do
    echo "$i => $var"
    ((i++))
done

$ set -f
$ ./script.sh *
./script.sh
1 => program
2 => program.cpp
3 => script.sh

对于 set -f 我希望输出是

$ ./script.sh *
./script.sh
1 => *

我缺少什么以及如何停止扩展。

你是运行脚本在一个单独的shell(运行 ./script.sh forks a sub-shell)比你实际设置的选项 set -f 打开。尝试将其放入脚本中,以便它在设置选项的情况下运行,

$ ./script.sh *
./script.sh
1 => *

或者您可以在当前 shell 中获取脚本,如下所示,并应用 set 选项。

$ set -f
$ source script.sh *
/usr/bin/bash
1 => *

请参阅此跨站点参考 What is the difference between executing a Bash script vs sourcing it?,它提供了对我们在此处理的问题的一些很好的见解。