我想知道是否可以在 bash 中设置“全局”别名,例如 zsh 的-Galias 选项 - 从用户的角度来看不是“全局”,而是从 shell 的角度来看。
我想知道的是:别名(或其他东西?)可以在 bash 中的任意位置替换吗?
例如。:
alias ...='../..'
答案1
Bash 别名没有此功能,但您可以编写:
alias cd='cd '
alias ...='../..'
cd ... # teleport to ../..
解释:
如果别名值的最后一个字符为空白,则还会检查别名后面的下一个命令字是否有别名扩展。
可能的解决方案是 aReadline
的宏。你可以写:
set -o emacs
bind '"\C-x...":"cd ../.."'
键入echo
, Control+ x,...
你应该看到echo cd ../..
看
- “按键绑定”在Readline 初始化文件语法
help bind
答案2
从bash(1)
手册页:
ALIASES
Aliases allow a string to be substituted for a word when it is used as
the first word of a simple command. [...]
所以bash
别名不具备这种能力,也不bash
具有微不足道的pre-exec
能力(但是看这里不过,对于黑客来说)。
作为一个部分的您也许可以使用解决方法完成函数,这是一个最小的起点:
function _comp_cd() {
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
[[ $cur =~ \.\.\. ]] && {
cur=${cur/.../..\/..}
COMPREPLY=( $cur )
return
}
COMPREPLY=() # let default kick in
}
complete -o bashdefault -o default -F _comp_cd cd
现在,当您在命令上按 Tab 键cd
并且光标下的单词包含“...”时,每个单词都将替换为“../..”。不过,完成也遇到了一个小问题(不包括其复杂性),您可能可以从上面猜到,您需要在逐个命令的基础上指定它。
这bash 完成包使用默认的完成处理程序,通过即时加载完成函数来处理这个问题。如果您喜欢冒险,您应该能够修改其_filedir()
用于一般文件/目录扩展的内部函数,以便包含类似的替换“...”。
(所有这些都让人想起 NetWare shell,它使“...”正常工作。)
答案3
bash 别名仅基于该行的第一个单词起作用,不能像 zsh 那样在全局意义上定义。
我能想到的唯一的办法就是定义一个变量,例如
export PP=../.. # $PP meaning parent of parent
cd $PP/anotherDirectory
但说实话,在这种情况下我更愿意只输入 ../.. 。简而言之 bash 不这样做。