请注意,Ctrl-Alt-E输入bash
不仅会扩展别名。它还扩展变量,命令替换(!),进程替换(!),算术扩展并删除引号(它不执行文件名生成(globbing)或波浪号扩展)。
它并不总是设法扩展别名。因此,尽管有其用途,但重要的是要认识到其结果可能会更改命令行的含义,产生副作用并具有潜在危险。
例如在:
$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done
如果我按M-C-E
这里,那将给我:
$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done
这给了我一个完全不同的命令行(想像一下,如果我没有rm -rf *
使用pwd
上面的命令行,将会发生什么)并且不扩展foo
别名。
使用zsh
,以在Gilles关于函数内部扩展的别名的注释的基础上,您可以执行以下操作:
expand-aliases() {
unset 'functions[_expand-aliases]'
functions[_expand-aliases]=$BUFFER
(($+functions[_expand-aliases])) &&
BUFFER=${functions[_expand-aliases]#$'\t'} &&
CURSOR=$#BUFFER
}
zle -N expand-aliases
bindkey '\e^E' expand-aliases
仅当当前命令行在语法上有效时,这才会扩展别名(因此,它还可以用作语法检查器)。
与bash
的MCE 相反,它也可以完全解析别名。例如,如果您有:
$ alias ll='ls -l'; alias ls='ls --color'
$ ll
将扩展为:
$ ls --color -l
请注意,它还会规范化语法,例如:
$ for i (*) cmd $i; foo
将更改为:
$ for i in *
do
cmd $i
done
foo
C-x a
在光标下扩展别名(假设您正在使用完成系统)。