Home > Mobile >  zsh command not found error when setting an alias
zsh command not found error when setting an alias

Time:01-26

Currently trying to move all of my aliases from .bash_profile to .zshrc. However, found a problem with one of the longer aliases I use for substituting root to ubuntu when passing a command to access AWS instances.

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

The error I get is AWS:5: command not found ssh -i keypair.pem [email protected]

I would really appreciate any suggestions!

CodePudding user response:

The basic problem is that the cmd=$(echo ... line is mashing all the arguments together into a space-delimited string, and you're depending on word-splitting to split it up into a command and its arguments. But word-splitting is usually more of a problem than anything else, so zsh doesn't do it by default. This means that rather than trying to run the command named ssh with arguments -i, keypair.pem, etc, it's treating the entire string as the command name.

The simple solution is to avoid mashing the arguments together, so you don't need word-splitting to separate them out again. You can use a modifier to the parameter expansion to replace "root" with "ubuntu". BTW, I also strongly recommend checking for error when using cd, and not proceeding if it gets an error.

So something like this:

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

This syntax will work in bash as well as zsh (the double-quotes prevent unexpected word-splitting in bash, and aren't really needed in zsh).

BTW, I'm also a bit nervous about just blindly replacing "root" with "ubuntu" in the arguments; what if it occurs somewhere other than the username, like as part of a filename or hostname?

  •  Tags:  
  • Related