如何修改zsh的tgss函数,自动为输入加单引号执行terragrunt命令?
问题描述
我在.zshrc中定义了如下tgss函数:
function tgss() { input=("$@") # Store input arguments as array to avoid escaping double quotes escaped_input="${input[*]}" # Join array elements into a string result=$(terragrunt state show "$escaped_input") echo "$result" }
该函数用于接收terragrunt state list输出的资源条目(例如aws_sqs_queue.default[\"subscription-name-number\"]),执行terragrunt state show命令查询资源详情。但执行tgss aws_sqs_queue.default[\"subscription-name-number\"]时,出现错误:
zsh: no matches found: aws_sqs_queue.default[subscription-name-number]
推测问题与双引号转义有关,希望修改函数,实现无需手动添加单引号,自动为输入包裹单引号执行命令。
解决方案
问题根源是zsh会把[]当作文件名通配符解析,即使转义了双引号,zsh在解析命令参数时还是会先处理[],导致匹配不到文件时报错。
直接修改函数,利用"$@"直接传递所有参数给terragrunt state show即可,zsh会正确保留每个参数的原始格式,无需额外转义或包裹引号:
function tgss() { terragrunt state show "$@" }
为什么这个修改有效?
"$@"会将所有传入的参数以原始、未修改的形式传递给后续命令,每个参数都会被正确包裹,避免zsh解析通配符。- 执行时直接输入资源名即可,不需要转义双引号:
甚至连双引号都可以省略(只要资源名里没有空格):tgss aws_sqs_queue.default["subscription-name-number"]tgss aws_sqs_queue.default[subscription-name-number]
如果需要将所有参数合并为单个字符串处理(比如资源名包含空格的场景),可以改用"$*":
function tgss() { terragrunt state show "$*" }
"$*"会将所有参数用空格连接成一个字符串,同样会正确包裹,避免通配符解析。
内容的提问来源于stack exchange,提问作者Itai Ganot
相关产品推荐
相关产品推荐

