3.5.1. 什么是别名?

当字符串用作简单命令的第一个单词时,别名允许将字符串替换为单词。shell 维护一个别名列表,可以使用aliasunalias内置命令设置和取消设置。发出不带选项的别名以显示当前 shell 已知的别名列表。

  1. franky: ~> alias
  2. alias ..='cd ..'
  3. alias ...='cd ../..'
  4. alias ....='cd ../../..'
  5. alias PAGER='less -r'
  6. alias Txterm='export TERM=xterm'
  7. alias XARGS='xargs -r'
  8. alias cdrecord='cdrecord -dev 0,0,0 -speed=8'
  9. alias e='vi'
  10. alias egrep='grep -E'
  11. alias ewformat='fdformat -n /dev/fd0u1743; ewfsck'
  12. alias fgrep='grep -F'
  13. alias ftp='ncftp -d15'
  14. alias h='history 10'
  15. alias fformat='fdformat /dev/fd0H1440'
  16. alias j='jobs -l'
  17. alias ksane='setterm -reset'
  18. alias ls='ls -F --color=auto'
  19. alias m='less'
  20. alias md='mkdir'
  21. alias od='od -Ax -ta -txC'
  22. alias p='pstree -p'
  23. alias ping='ping -vc1'
  24. alias sb='ssh blubber'
  25. alias sl='ls'
  26. alias ss='ssh octarine'
  27. alias tar='gtar'
  28. alias tmp='cd /tmp'
  29. alias unaliasall='unalias -a'
  30. alias vi='eval \`resize\`;vi'
  31. alias vt100='export TERM=vt100'
  32. alias which='type'
  33. alias xt='xterm -bg black -fg white &'
  34. franky ~>

别名可用于指定系统上多个版本中存在的命令的默认版本,或指定命令的默认选项。别名的另一个用途是纠正不正确的拼写。

如果没有引用每个简单命令的第一个单词,则检查它是否有别名。如果是这样,则该词将替换为别名的文本。别名和替换文本可以包含任何有效的 shell 输入,包括 shell 元字符,但别名可能不包含”=”除外。替换文本的第一个单词会测试别名,但与正在扩展的别名相同的单词不会再次扩展。例如,这意味着可以将 ls 别名为 ls -F ,并且Bash 不会尝试递归地扩展替换文本。如果别名值的最后一个字符是空格或制表符,则别名后的下一个命令字也会检查别名扩展。

当 shell 不是交互式的时,别名不会被扩展,除非expand_aliases选项是使用内置的shopt shell 设置的。

3.5.2. 创建和删除别名

别名是使用alias 创建的。要永久使用,请在您的一个 shell 初始化文件中输入alias;如果只是在命令行中输入别名,则只能在当前 shell 中识别。

  1. franky ~> alias dh='df -h'
  2. franky ~> dh
  3. Filesystem Size Used Avail Use% Mounted on
  4. /dev/hda7 1.3G 272M 1018M 22% /
  5. /dev/hda1 121M 9.4M 105M 9% /boot
  6. /dev/hda2 13G 8.7G 3.7G 70% /home
  7. /dev/hda3 13G 5.3G 7.1G 43% /opt
  8. none 243M 0 243M 0% /dev/shm
  9. /dev/hda6 3.9G 3.2G 572M 85% /usr
  10. /dev/hda5 5.2G 4.3G 725M 86% /var
  11. franky ~> unalias dh
  12. franky ~> dh
  13. bash: dh: command not found
  14. franky ~>

在执行该行的任何命令之前,Bash 总是读取至少一个完整的输入行。别名在读取命令时扩展,而不是在执行命令时扩展。因此,与另一个命令出现在同一行的别名定义在读取下一行输入之前不会生效。该行别名定义之后的命令不受新别名的影响。执行函数时,此行为也是一个问题。别名在读取函数定义时扩展,而不是在执行函数时扩展,因为函数定义本身就是一个复合命令。因此,在函数中定义的别名在该函数执行之前不可用。为了安全起见,请始终将别名定义放在单独的行上,并且不要使用别名 在复合命令中。

别名不被子进程继承。Bourne shell ( sh ) 不识别别名。

3.5别名 - 图1
函数更快
别名在函数之后查找,因此解析速度较慢。虽然别名更容易理解,但对于几乎所有用途,shell 函数都优于别名。

https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_05.html