Zauważ, że Ctrl-Alt-E in bash
nie tylko rozwija aliasy. Rozszerza także zmienne, podstawianie poleceń (!), Podstawianie procesów (!), Interpretację arytmetyczną i usuwa cudzysłowy (nie generuje nazw plików (globbing) ani interpretacji tyldy).
Nie zawsze udaje się rozwinąć aliasy. Tak więc, chociaż ma swoje zastosowania, ważne jest, aby zdać sobie sprawę, że jego wynik potencjalnie zmienia znaczenie wiersza poleceń, ma skutki uboczne i jest potencjalnie niebezpieczny.
Na przykład w:
$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done
Jeśli nacisnę M-C-E
tutaj, to daje mi:
$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done
Co daje mi zupełnie inną linię poleceń (i wyobraź sobie, co by się stało, gdybym miał rm -rf *
zamiast pwd
wyżej) i nie rozszerza foo
aliasu.
Dzięki zsh
, aby rozwinąć uwagę Gillesa na temat rozszerzonych funkcji aliasów, możesz:
expand-aliases() {
unset 'functions[_expand-aliases]'
functions[_expand-aliases]=$BUFFER
(($+functions[_expand-aliases])) &&
BUFFER=${functions[_expand-aliases]#$'\t'} &&
CURSOR=$#BUFFER
}
zle -N expand-aliases
bindkey '\e^E' expand-aliases
Spowoduje to rozwinięcie aliasów tylko wtedy, gdy bieżący wiersz poleceń jest poprawny pod względem składniowym (dlatego też pełni funkcję sprawdzania składni).
W przeciwieństwie do bash
MCE, rozwiązuje również w pełni aliasy. Na przykład, jeśli masz:
$ alias ll='ls -l'; alias ls='ls --color'
$ ll
Zostanie rozszerzony do:
$ ls --color -l
Zauważ, że kanonizuje również składnię, więc rzeczy takie jak:
$ for i (*) cmd $i; foo
zostanie zmieniony na:
$ for i in *
do
cmd $i
done
foo
C-x a
rozwija alias pod kursorem (zakładając, że używasz systemu uzupełniania).