我知道我可以使用set +f
和启用/禁用通配符set -f
。
但我如何测试它当前是否启用?
我可以创建一个具有唯一名称的文件,并测试是否存在具有与其匹配的模式的文件。不过,我希望有一个更清洁的解决方案。
答案1
如果您这样做set -f
,或者以其他方式禁用通配:,$-
将包含f
:
$ echo $-
himBHs
$ set -f
$ echo $-
fhimBHs
$ bash -fc 'echo $-'
fhBc
所以:
[[ $- = *f* ]]
或者:
case $- in
*f*) ... ;;
esac
答案2
至少bash
,我不知道这是否是特定于 shell 的,您可以使用test -o <optname>
.对应的选项名称-f
是noglob
这样你可以做这样的事情:
$ set -f
$ test -o noglob; echo $?
$ set +f
$ test -o noglob; echo $?
或者,在脚本中,
if [ -o noglob ]; then
echo globbing disabled
else
echo globbing enabled
fi
答案3
该变量$-
包含当前标志。
所以你可以做
case "$-" in
(*'f'*) echo "file globbing is disabled" ;;
(*) echo "file globbing is enabled" ;;
esac
答案4
有几种方法。
最便携的测试正在扩展
$-
set -f; [ -z "${-##*f*}" ] && echo noglob set
在 bash 和一些 shell 中:
[ -o noglob ] && echo noglob
对几个 shell 的测试是:
set -o | grep noglob
仅适用于 bash 的是:
$ shopt -op noglob shopt -o noglob # +o if globbing is active.
而且,如果您需要静默测试:
if shopt -oq noglob; then echo noglob set; fi
您还可以通过 globbing 的作用来测试(非常便携):
set -- .*; if [ "$#" -gt 1 ]; then echo glob active; fi