You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:23:20