115

Is there a way to expand aliases inline in bash?

$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l 
asdfg
  • 2,806
  • 4
  • 20
  • 23

4 Answers4

147

You can press Ctrl-Alt-e to perform the readline function shell-expand-line which will do alias, history and word expansions. Note that on some keyboards Meta is not Alt. You might need to press Esc then Ctrl-e

The functions alias-expand-line and history-and-alias-expand-line are not bound by default, but you can bind them by adding lines similar to the following to your ~/.inputrc file.

"\e\C-l": alias-expand-line

which would make Ctrl-Alt-l (lower case "ell") perform only alias expansion.

Dennis Williamson
  • 106,229
  • 19
  • 167
  • 187
  • Can we map alias expansion to without affecting other bash completions?. – asdfg Feb 19 '11 at 15:44
  • 2
    @asdfg: If you do, it will break other completions. It *might* work (untested) to create the map as shown above and then add this additional map to replace the existing one for Tab: `"\C-i": "\e\C-l\e\e"` which creates a macro that performs both `alias-expand-line` and `complete`. It depends on the binding from my answer above and that the default binding for Esc-Esc remains in place. You would still be able to do Esc-Esc if you wanted to do default completion. – Dennis Williamson Feb 19 '11 at 16:03
  • 7
    Indeed, `ESC C-e` works for Bash, but `C-x a` works for Zsh. Also tested on OS X. – Blaz Oct 05 '15 at 19:40
  • If you're simply looking for Ctrl+something, where something can be the "x" key, you can do it like this in some systems: `Control-x: history-and-alias-expand-line`. – igordcard Nov 14 '16 at 14:33
  • Note that when you manually expand aliases that contain quotes (such as an `alias foo='this "bar"'`), the quotes will disappear upon expansion with Ctrl+Alt+E. But rest assured that they get properly sent to the actual command when you *really* use the alias. You can verify this by putting a `--something` option inside double quotes. The command will work when used as an alias. But your program will fail with a message such as "invalid option --something" when manually expanded to the non-quoted version. –  Dec 15 '16 at 20:48
  • `Ctrl-Alt-l` locked my X session ... I would suggest using other combinations. – Weijun Zhou Nov 24 '18 at 15:18
  • 1
    @WeijunZhou: That depends on your window manager and any custom settings you have. For Gnome, for example, lock screen is Super+L. – Dennis Williamson Nov 24 '18 at 15:34
  • @Blaz I can't get `C-x a` to work in macOS Catalina 10.15.2. – eethirteenzz Jan 03 '20 at 20:47
  • 1
    It's worth adding this works only if the alias is the first part of your line, and won't work for alias in the middle of the command, e.g. it works for ``k get po`` but not for ``watch k get po`` where ``alias k=kubectl``. – Meitham May 10 '20 at 08:29
  • 1
    @Meitham: zsh supports suffix and "global" (meaning replaced anywhere on the line) aliases as well (with `alias -s` and `alias -g` respectively), but bash does not do those. http://zsh.sourceforge.net/Intro/intro_8.html – Fizz Jun 26 '20 at 09:32
  • I was hoping the tab key could be overloaded so I don't have to remember another shortcut. It looks like it can't elegantly be done: https://brbsix.github.io/2015/11/23/perform-tab-completion-for-aliases-in-bash/ – Sridhar Sarnobat Apr 29 '22 at 21:27
14

For people having zsh & Oh My ZSH installed looking for a simple solution, globalias might be your friend

Expands all glob expressions, subcommands and aliases (including global).

# .zsrc:
alias S="sudo systemctl"

$ S<space>
# expands to:
$ sudo systemctl

to install just add "globalias" to you .zshrc plugin list

plugins=(... globalias)

Then just press SPACE to trigger the expansion of a command you've written.

If you only want to insert a space without expanding the command line, press CTRL+SPACE

Can Rau
  • 241
  • 2
  • 5
0

This does not work. But I'm guessing/hoping something like this can be done to do what you want to do. You would have to use your own completion script. This is how you make one:

_ll()
{
     COMPREPLY=(ls -l)
     #The next line does not work. I just hope there were a way to replace that word
     COMP_WORDS[COMP_CWORD-1]="ls -l"
}
complete -F _ll ll

Now source the full bash_completion file(http://caliban.org/bash) and put the above mentioned script in a file inside bash_completion.d directory that the script you get from the url references. Let me know if it doesn't work.

Thanks.

0fnt
  • 1,931
  • 7
  • 24
  • 38
-1

This actually might be a much simpler way to do what you're trying to (bashversion >= 4.2.29):

shopt -s direxpand
shopt -s expand_aliases

shopt's man page: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

  • 10
    This is wrong. Shell options "direxpand" and "expand_aliases" do not help expand the aliases inline like the question specifies. I do not know from which hat "direxpand" was taken...? By default, "expand_aliases" is already set. If you unset it, the result is to basically disable aliases from working (they are not expanded before interpretation of the command line). E.g. given an alias `alias ll='ls -l` the shell would interpret 'll' as command/function 'll' which likely does not exist. – FooF Sep 29 '17 at 08:38
  • @FooF: yeah, that option does something else: "Aliases are not expanded when the shell is not interactive, unless the `expand_aliases` shell option is set using `shopt`." https://www.gnu.org/software/bash/manual/html_node/Aliases.html#Aliases – Fizz Jun 26 '20 at 09:22