有没有办法在 bash 中内联扩展别名?
$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l
答案1
您可以按Ctrl- Alt-e执行 readline 函数shell-expand-line
,该函数将执行别名、历史记录和单词扩展。请注意,在某些键盘上Meta不是Alt。您可能需要Esc按Ctrl-e
默认情况下,函数alias-expand-line
和history-and-alias-expand-line
不受绑定,但您可以通过在~/.inputrc
文件中添加类似于以下的行来绑定它们。
"\e\C-l": alias-expand-line
这将使Ctrl- Alt- l(小写的“ell”)执行仅有的别名扩展。
答案2
对于安装了 zsh 和 Oh My ZSH 并正在寻找简单解决方案的用户,全球化可能是你的朋友
扩展所有 glob 表达式、子命令和别名(包括全局)。
# .zsrc:
alias S="sudo systemctl"
$ S<space>
# expands to:
$ sudo systemctl
要安装,只需将“globalias”添加到 .zshrc 插件列表中
plugins=(... globalias)
然后只需按下
SPACE
即可触发您所编写的命令的扩展。如果只想插入空格而不扩展命令行,请按
CTRL+SPACE
答案3
这不起作用。但我猜测/希望可以做类似的事情来做你想做的事情。你必须使用自己的完成脚本。这是你制作一个的方法:
_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 获取的脚本引用的。如果它不起作用,请告诉我。
谢谢。
答案4
这实际上可能是执行您要执行的操作的一种更简单的方法(bash
版本 >= 4.2.29):
shopt -s direxpand
shopt -s expand_aliases
shopt
的man
頁面:https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html