如何在bash中内联扩展别名?


84

有没有办法在bash中内联扩展别名?

$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l 

Answers:


107

您可以按Ctrl- Alt- e执行readline的功能shell-expand-line,这将做别名,历史和字扩展。请注意,在某些键盘Meta上不是Alt。您可能需要按下Esc然后Ctrl-e

函数alias-expand-linehistory-and-alias-expand-line缺省情况下未绑定,但是您可以通过在~/.inputrc文件中添加类似于以下内容的行来绑定它们。

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

这将使Ctrl- - Altl小写“ELL”)执行别名扩展。


我们可以将别名扩展映射到<tab>而不影响其他bash的完成吗?
asdfg

2
@asdfg:如果这样做,它将破坏其他补全。它可能工作(未经测试)来创建地图,如上所示,然后添加该附加映射,以取代现有一个选项卡:"\C-i": "\e\C-l\e\e"创建将同时执行的宏alias-expand-linecomplete。这取决于上面我的回答中的绑定,并且Esc-Esc的默认绑定仍然存在。如果您想执行默认完成,则仍然可以执行Esc-Esc。
丹尼斯·威廉姆森

4
确实,它ESC C-e适用于Bash,但C-x a适用于Zsh。在OS X上也测试
Blaz

如果您只是在寻找Ctrl + something,其中某些东西可以作为“ x”键,则可以在某些系统中执行以下操作:Control-x: history-and-alias-expand-line
igordcard '16

1
@WeijunZhou:这取决于您的窗口管理器和任何自定义设置。例如,对于Gnome,锁定屏幕为Super + L。
丹尼斯·威廉姆森

2

实际上,这可能是您尝试执行的操作(bash版本> = 4.2.29)更简单的方法:

shopt -s direxpand
shopt -s expand_aliases

shoptman页面:https//www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html


3
错了 外壳程序选项“ direxpand”和“ expand_aliases”不能帮助扩展内联别名,如问题所指定。我不知道从哪顶帽子上取下了“ direxpand”……?默认情况下,“ expand_aliases”已设置。如果取消设置,则结果是基本上禁止使用别名(在解释命令行之前不会扩展别名)。例如,给定别名 alias ll='ls -l,shell会将“ ll”解释为可能不存在的命令/函数“ ll”。
FooF

0

这是行不通的。但是我猜/希望可以做这样的事情来做你想做的事。您将必须使用自己的完成脚本。这是您的制作方式:

_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

现在,获取完整的bash_completion文件(http://caliban.org/bash),并将上述脚本放在bash_completion.d目录中的文件中,该文件是您从url参考中获得的。让我知道它是否无效。

谢谢。


0

对于安装了zsh并正在寻找简单解决方案的人们,globalias可能是您的朋友

扩展所有glob表达式,子命令和别名(包括全局)。

# .zsrc:
alias S="sudo systemctl"

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

要安装,只需将“ globalias”添加到您的.zshrc插件列表中

plugins=(... globalias)

然后,只需按一下SPACE即可触发您编写的命令的扩展。

如果只想插入空格而不扩展命令行,请按 CTRL+SPACE

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.