Зауважте, що Ctrl-Alt-E у bash
не тільки розширює псевдоніми. Він також розширює змінні, підстановку команд (!), Підстановку процесу (!), Розширення арифметики та видалення лапок (це не робить генерацію імен файлів (глобалізація) чи розширення тильди).
Це не завжди вдається розширити псевдоніми. Тому, хоча він має свої цілі, важливо усвідомити, що його результат потенційно змінює значення командного рядка, має побічні ефекти та є потенційно небезпечними.
Наприклад у:
$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done
Якщо я натискаю M-C-E
тут, це дає мені:
$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done
Що дає мені зовсім інший командний рядок (і уявіть, що було б, якби я мав rm -rf *
замість pwd
вище) і не розширює foo
псевдонім.
З zsh
, щоб створити на ноті Жиля синоніми розширених всередині функцій, ви можете зробити:
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
Це розширить псевдоніми лише в тому випадку, якщо поточний командний рядок є синтаксично дійсним (тому він подвоюється як перевірка синтаксису).
На відміну від bash
MCE, він також вирішує псевдоніми повністю. Наприклад, якщо у вас є:
$ alias ll='ls -l'; alias ls='ls --color'
$ ll
Буде розширено до:
$ ls --color -l
Зауважте, що він також канонізує синтаксис таким чином:
$ for i (*) cmd $i; foo
буде змінено на:
$ for i in *
do
cmd $i
done
foo
C-x a
розширює псевдонім під курсором (припускаючи, що ви використовуєте систему завершення).