Do global aliases exist in bash

I wonder if it is possible to set a “global” alias in bash, like zsh’s -g alias option – not “global” from the user’s point of view but from the shell’s point of view.

What I want to know is: Can an alias (or something else?) be substituted anywhere on a line in bash?

e.g..:

alias ...='../..'
Asked By: maxxvw

||

bash aliases only work based on the first word on the line and can not be defined in a global sense like zsh.

The only fudge I can think of would be to define a variable e.g.

export PP=../..  # $PP meaning parent of parent
cd $PP/anotherDirectory

But to be honest I would prefer to just type ../.. in that case. In short bash does not do it.

Answered By: MoopyGlue

From the bash(1) man page:

ALIASES 
  Aliases allow a string to be substituted for a word when it is used  as
  the  first  word  of  a  simple command. [...]

So bash aliases do not have this capability, nor does bash have a trivial pre-exec capability (but see here for a hack though).

As a partial workaround you may be able to use a completion function, here’s a minimal starting point:

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

Now when you hit tab on a cd command and the word under the cursor contains “…”, each will be replaced with “../..”. Completion suffers from a slight problem too though (excluding its complexity) which you can probably guess from the above, you need to specify it on a command by command basis.

The bash-completion package uses a default completion handler, with on-the-fly loading of completion functions to deal with this. If you’re feeling adventurous you should be able to modify its internal function _filedir() function which is used for general file/directory expansion so as to include a similar substitution “…”.

(All of which reminds of the NetWare shell, which made “…” Just Work.)

Answered By: mr.spuratic

Bash aliases do not have this capability, but you can write:

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

Explanation:

Bash Reference Manual says:

If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.

Possible solution is a Readline‘s macro. You can write:

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

Type echo,Control+x,...

You should see echo cd ../..

See

Answered By: Evgeny Vereshchagin
Categories: Answers Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.