bash 中是否存在全局别名

bash 中是否存在全局别名

我想知道是否可以在 bash 中设置“全局”别名,例如 zsh 的-Galias 选项 - 从用户的角度来看不是“全局”,而是从 shell 的角度来看。

我想知道的是:别名(或其他东西?)可以在 bash 中的任意位置替换吗?

例如。:

alias ...='../..'

答案1

Bash 别名没有此功能,但您可以编写:

alias cd='cd '
alias ...='../..'
cd ... # teleport to ../..

解释:

Bash 参考手册说:

如果别名值的最后一个字符为空白,则还会检查别名后面的下一个命令字是否有别名扩展。

可能的解决方案是 aReadline的宏。你可以写:

set -o emacs
bind '"\C-x...":"cd ../.."'

键入echo, Control+ x,...

你应该看到echo cd ../..

答案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 不这样做。

相关内容