DEV Community

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

Posted on • Edited 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

Oldest comments (9)

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 🤘

Collapse
 
alexgeorgiev17 profile image
Alex Georgiev

This is really cool! Thanks for sharing it!

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
 
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
 
greg_hostetler_d36be575ad profile image
Greg Hostetler

Also you could add alias aliasname; to the beginning or end of the alias and it will always print the alias at the begining or end

#alias definition
alias ls='alias ls; ls -al --group-directories-first -v --color=auto'

# output
ls='alias ls; ls -al --group-directories-first -v --color=auto'
#Then run the alias.
Enter fullscreen mode Exit fullscreen mode

I always want to know exactly what I'm running. The older I get the more I forget. lol