ZSH 如何将命令使用的变量中的通配符解释为路径

ZSH 如何将命令使用的变量中的通配符解释为路径

我尝试通过 zsh 脚本传递带有“*”(通配符)的变量,但它不起作用。 ls、grep 和其他命令会抱怨任何带有“*”的路径。

这是一个简单的问题示例:

➜  ~ mkdir -p /tmp/TEST/{22,3}
➜  ~ ls -l /tmp/TEST/*
/tmp/TEST/22:

/tmp/TEST/3:
➜  ~ TEST_PATH="/tmp/TEST/*"
➜  ~ ls -l $TEST_PATH
ls: /tmp/TEST/*: No such file or directory

答案1

与其他类似 sh 的 shell 不同,zsh 在扩展未加引号的变量时不执行通配符扩展和分词。不带引号的$TEST_PATH几乎就是您直观所期望的:变量值的简单替换。 “几乎”是因为如果结果是空词,则该词将被完全删除。

要获取变量的值并在其中扩展通配符,请使用${~…}以下形式参数扩展:${~TEST_PATH}也可以不带大括号书写$~TEST_PATH

如果没有匹配,则$~TEST_PATH触发错误。要获取空列表,请使用N 全局限定符:$~TEST_PATH(N)

相关内容