转义zsh Alias中的反斜杠和双引号

  • 本文关键字:zsh Alias 转义 linux shell zsh
  • 更新时间 :
  • 英文 :


我正在尝试创建一个别名,它应该变成以下命令:

aws ssm start-automation-execution --document-name "AWS-StartEC2Instance" --document-version "$DEFAULT" --parameters '{"AutomationAssumeRole":[""]}' --target-parameter-name InstanceId --targets '[{"Key":"ResourceGroup","Values":["DemoInstances"]}]' --max-errors "1" --max-concurrency "1" --region ap-southeast-1

直接输入

alias startdemoinstances="aws ssm start-automation-execution --document-name "AWS-StartEC2Instance" --document-version "$DEFAULT" --target-parameter-name InstanceId --targets "[{"Key":"ResourceGroup","Values":["DemoInstances"]}]" --max-errors "1" --max-concurrency "1" --region ap-southeast-1"

在bash上,但是在zsh上,命令变成

aws ssm start-automation-execution --document-name AWS-StartEC2Instance --document-version $DEFAULT --target-parameter-name InstanceId --targets '''[{Key:ResourceGroup,Values:[DemoInstances]}]''' --max-errors 1 --max-concurrency 1 --region ap-southeast-1

我不能让"逃脱。

看起来您将第一个和最后一个双引号视为整个表达式的'周围'引号,但这不是它在zshbash中的工作方式。相反,它是一个由一组带引号和不带引号的字符串组成的表达式,因为它们相邻而连接在一起。

一个简短的例子。:

a=X b=Y c=Z
echo '$a'$b'$c'

将打印如下内容:

$aY$c

只有$a$c是单引号,因此不展开。

由于示例中的一些字符(例如[,{)实际上没有引号,因此shell会尝试展开它们。它在zsh中失败,因为默认行为是如果一个glob没有匹配就退出。

有几种方法可以修复它。


选项1 -使zsh的行为像bash:

unsetopt nomatch
alias startdemoinstances="aws ssm start-automation-execution --document-name "AWS-StartEC2Instance" --document-version "$DEFAULT" --target-parameter-name InstanceId --targets "[{"Key":"ResourceGroup","Values":["DemoInstances"]}]" --max-errors "1" --max-concurrency "1" --region ap-southeast-1"
setopt nomatch

不建议这样做。有很多方法可以让它变得混乱,因为我们指望shell以一种精确的方式忽略特殊字符。


选项2 -转义内部双引号,使表达式变成一个长字符串:

alias startdemoinstances="aws ssm start-automation-execution --document-name "AWS-StartEC2Instance" --document-version "$DEFAULT" --target-parameter-name InstanceId --targets "[{"Key":"ResourceGroup","Values":["DemoInstances"]}]" --max-errors "1" --max-concurrency "1" --region ap-southeast-1"

这也应该在bash中工作,并且在那里将是一个非常好的主意。


选项3 -正如@chepner建议的那样,使用一个更容易读的函数:

function startdemoinstances {
aws ssm start-automation-execution 
--document-name 'AWS-StartEC2Instance' 
--document-version "$DEFAULT" 
--target-parameter-name 'InstanceId' 
--targets '[{"Key":"ResourceGroup","Values":["DemoInstances"]}]' 
--max-errors '1' 
--max-concurrency '1' 
--region 'ap-southeast-1'
}

这也应该在bash中工作。

相关内容

  • 没有找到相关文章

最新更新