相关:停止外壳通配符扩展?
我过去曾在 bash 中使用过 set -f
来防止全球扩张 - 但这似乎不再适用于我的 mac:
$ cat script.sh
#!/bin/bash
echo $0
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
分叉子 shell(,而不是您实际设置选项set -f
的 shell。尝试将其放入脚本中,以便它与选项集一起运行,
$ ./script.sh *
./script.sh
1 => *
或者,您可以在当前 shell 中获取脚本,如下所示,并应用 set
选项。
$ set -f
$ source script.sh *
/usr/bin/bash
1 => *
请参阅此跨站点参考 执行 Bash 脚本与获取脚本有什么区别? 这为我们在这里处理的问题提供了一些很好的见解。