设置别名时找不到 zsh 命令错误

zsh command not found error when setting an alias

目前正在尝试将我的所有别名从 .bash_profile 移动到 .zshrc。但是,在传递访问 AWS 实例的命令时,我使用将 root 替换为 ubuntu 的较长别名之一发现了问题。

AWS (){                                                                          
    cd /Users/user/aws_keys                                                                          
    cmd=$(echo $@ | sed "s/root/ubuntu/g")                                                                                                        
    $cmd[@]                                                                      
} 

我得到的错误是AWS:5: command not found ssh -i keypair.pem ubuntu@ec1.compute.amazonaws.com

如果有任何建议,我将不胜感激!

基本问题是 cmd=$(echo ... 行将所有参数混合成一个 space-delimited 字符串,而您依赖 word-splitting 将其拆分为一个命令及其论据。但是 word-splitting 通常比其他任何问题都更麻烦,所以 zsh 默认情况下不会这样做。这意味着它不是尝试 运行 带有参数 -ikeypair.pem 等的名为 ssh 的命令,而是将整个字符串视为命令名称。

简单的解决方案是避免将参数混在一起,这样您就不需要 word-splitting 再次将它们分开。您可以对参数扩展使用修饰符,将“root”替换为“ubuntu”。顺便说一句,我还强烈建议在使用 cd 时检查错误,如果出现错误则不要继续。

所以像这样:

AWS (){
    cd /Users/user/aws_keys  || return $?
    "${@//root/ubuntu}"
} 

此语法在 bash 和 zsh 中都有效(double-quotes 防止在 bash 中出现意外的 word-splitting,而在 zsh 中并不是真正需要的。

顺便说一句,我也有点担心在参数中盲目地将“root”替换为“ubuntu”;如果它出现在用户名以外的其他地方,比如作为文件名或主机名的一部分怎么办?