Lưu ý rằng Ctrl-Alt-E bash
không chỉ mở rộng bí danh. Nó cũng mở rộng các biến, thay thế lệnh (!), Thay thế quá trình (!), Mở rộng số học và xóa các trích dẫn (nó không tạo ra tên tệp (globalbing) hoặc mở rộng dấu ngã).
Nó không luôn luôn quản lý để mở rộng bí danh. Vì vậy, trong khi nó có công dụng, điều quan trọng là nhận ra kết quả của nó có khả năng thay đổi ý nghĩa của dòng lệnh, có tác dụng phụ và có khả năng nguy hiểm.
Ví dụ:
$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done
Nếu tôi nhấn M-C-E
vào đây, điều đó mang lại cho tôi:
$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done
Điều này mang lại cho tôi một dòng lệnh hoàn toàn khác nhau (và tưởng tượng những gì sẽ xảy ra nếu tôi có rm -rf *
thay vì pwd
ở trên) và không mở rộng foo
bí danh.
Với zsh
, để xây dựng ghi chú của Gilles về các bí danh được mở rộng bên trong các chức năng, bạn có thể làm:
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
Điều đó sẽ mở rộng các bí danh chỉ khi dòng lệnh hiện tại có hiệu lực về mặt cú pháp (vì vậy nó sẽ tăng gấp đôi như một trình kiểm tra cú pháp).
Trái ngược với bash
MCE, nó cũng giải quyết hoàn toàn các bí danh. Ví dụ: nếu bạn có:
$ alias ll='ls -l'; alias ls='ls --color'
$ ll
Sẽ được mở rộng thành:
$ ls --color -l
Lưu ý rằng nó cũng chuẩn hóa cú pháp để những thứ như:
$ for i (*) cmd $i; foo
sẽ được đổi thành:
$ for i in *
do
cmd $i
done
foo
C-x a
mở rộng bí danh dưới con trỏ (giả sử bạn đang sử dụng hệ thống hoàn thành).