โปรดทราบว่า Ctrl-Alt-E ในbash
ไม่เพียง แต่ขยายนามแฝง นอกจากนี้ยังขยายตัวแปร, การแทนที่คำสั่ง (!), การทดแทนโปรเซส (!), เลขคณิตขยายและลบเครื่องหมายคำพูด (มันไม่ได้สร้างชื่อไฟล์ (globbing) หรือการขยายตัวหนอน
ไม่สามารถขยายชื่อแทนได้เสมอไป ดังนั้นในขณะที่มีการใช้งานสิ่งสำคัญคือการตระหนักถึงผลลัพธ์ที่อาจเปลี่ยนแปลงความหมายของบรรทัดคำสั่งมีผลข้างเคียงและอาจเป็นอันตราย
ตัวอย่างเช่นใน:
$ 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
การสร้างบันทึกย่อของ Gilles ในนามแฝงที่ขยายภายในฟังก์ชั่นคุณสามารถทำได้:
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
ที่จะขยายนามแฝงเฉพาะถ้าบรรทัดคำสั่งปัจจุบันมีความถูกต้อง syntactically (ดังนั้นจึงเป็นสองเท่าเป็นตัวตรวจสอบไวยากรณ์)
ตรงกันข้ามกับ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
ขยายนามแฝงใต้เคอร์เซอร์ (สมมติว่าคุณกำลังใช้ระบบเสร็จสิ้น)