DEV Community

Cover image for Reveal the command behind an alias with ZSH
Camilo Martinez
Camilo Martinez

Posted on • Updated on

Reveal the command behind an alias with ZSH

I love alias commands, but also aalias_forlways like to 🕵️‍♀️ spy on what is the real command behind an alias. There are a lot of ways to see it:

  • Using the alias <command> on terminal
  • Using the keyboard shortcut combination ctrl+x a (not ctrl+x+a) to expand it
  • Using the globalias plugin

But all of them need an extra step, and I found a way to see it always before the command runs.

Reveal

We can use a function to search the command associated with an alias adding this script on ~/.zshrc file.



local cmd_alias=""

# Reveal Executed Alias
alias_for() {
  [[ $1 =~ '[[:punct:]]' ]] && return
  local search=${1}
  local found="$( alias $search )"
  if [[ -n $found ]]; then
    found=${found//\\//} # Replace backslash with slash
    found=${found%\'} # Remove end single quote
    found=${found#"$search="} # Remove alias name
    found=${found#"'"} # Remove first single quote
    echo "${found} ${2}" | xargs # Return found value (with parameters)
  else
    echo ""
  fi
}

expand_command_line() {
  first=$(echo "$1" | awk '{print $1;}')
  rest=$(echo ${${1}/"${first}"/})

  if [[ -n "${first//-//}" ]]; then # is not hypen
    cmd_alias="$(alias_for "${first}" "${rest:1}")" # Check if there's an alias for the command
    if [[ -n $cmd_alias ]] && [[ "${cmd_alias:0:1}" != "." ]]; then # If there was and not start with dot
      echo "${T_GREEN}${T_YELLOW}${cmd_alias}${F_RESET}" # Print it
    fi
  fi
}

pre_validation() {
  [[ $# -eq 0 ]] && return                    # If there's no input, return. Else...
  expand_command_line "$@"
}


Enter fullscreen mode Exit fullscreen mode

Now we need to run this function every time the alias is entered. Happily, ZSH has a preexec function that can be associated with a hook. Just add this script after the previous on ~/.zshrc file.



autoload -U add-zsh-hook                      # Load the zsh hook module. 
add-zsh-hook preexec pre_validation           # Adds the hook 


Enter fullscreen mode Exit fullscreen mode

I'm not planning to remove this hook, but you can do it with this command:



add-zsh-hook -d preexec pre_validation        # Remove it for this hook.


Enter fullscreen mode Exit fullscreen mode

Once finish, reopen all terminals or update his source running source ~/.zshrc command and now you can see those secret commands.

Example

alias

Yellow: alias
Red: command behind revealed


Sources:


You can download or clone this code and other ZSH utilities from GitHub: dot Files repository.


That’s All Folks!
Happy Coding 🖖

beer

Top comments (8)

Collapse
 
michaelcurrin profile image
Michael Currin • Edited

Thanks. Didn't know about the hook or other options.

For manually check, I usually use which, or type.

$ which ll 
ll is aliased to ls -l
Enter fullscreen mode Exit fullscreen mode

I also like to use my ag alias. To find an alias based on a key or value.

github.com/MichaelCurrin/dotfiles/...

e.g. find all aliases using ls.

$ ag ls
alias ll="ls -l -h"
alias l1="ls -1"
...
Enter fullscreen mode Exit fullscreen mode

Or I could find one by key.

ag ll
Enter fullscreen mode Exit fullscreen mode
Collapse
 
defman profile image
Sergey Kislyakov

Just FYI, fish shell does that by default in a more interesting manner: it actually expands the command. So if you type e.g. ll and press space, fish would replace ll with ls -lh.

Collapse
 
equiman profile image
Camilo Martinez

Nice idea, I found a way to do it on ZSH adding the Globalias plugin.

Collapse
 
bhupesh profile image
Bhupesh Varshney 👾

For anyone using bash. Just press Ctrl+Alt+e

Collapse
 
equiman profile image
Camilo Martinez

Good information, I didn't know it.
I found that ctrl+x a do the same for ZSH

Collapse
 
alexgeorgiev17 profile image
Alex Georgiev

This is really cool! Thanks for sharing it!

Collapse
 
meldak profile image
Irving Gabriel Ocampo

It Is so pretty, thanks so much, it is so useful.

Collapse
 
equiman profile image
Camilo Martinez

You welcome @meldak 🤘