alias (命令)






在计算机运算中,alias 是许多命令行界面的命令,比如 Unix shell,4DOS/4NT 和 Windows PowerShell 等,它给用户提供了别名——也就是用自定义字符串替换指定命令的功能,通常用于简写系统命令,或给常用命令添加默认选项,MS-DOS 和 Microsoft Windows 操作系统里,通常使用 DOSKey 命令定义别名。


alias 命令的作用时间是命令运行之后到 shell 会话结束,经常使用的别名可在 shell 的配置文件比如 C Shell(csh)的 ~/.cshrc 或 Bourne Again Shell 的 ~/.bashrc 里定义,如此当相应的 shell 会话启动后就可以使用这些自定义的别名了。alias 命令可以直接写入这些配置文件,或单独放在一个文件,比如 .alias 里,或依用户使用的解释器分别定义于 .alias-bash,.alias-csh 等文件,然后使用 source 命令执行该文件来设定。




目录






  • 1 定义别名


  • 2 历史


  • 3 查看当前已定义的别名


  • 4 忽略别名


  • 5 更改别名


  • 6 删除别名


  • 7 特性


    • 7.1 Chaining


    • 7.2 别名里的引用


    • 7.3 命令参数




  • 8 典型别名


  • 9 备选


  • 10 参考资料


  • 11 外部链接





定义别名


别名可以使用给 alias 命令指定键值对参数的方式定义,在 Bash 里,语法如下:


alias copy='cp'

同样的别名,在 csh 或 tcsh 里可以这样指定:


alias copy "cp"

这个别名的作用,是当用户在命令行里输入 copy 时,命令行解释器会把该命令替换为 cp 命令来执行。


在 4DOS/4NT 命令行里,可以使用以下命令把 cp 定义为 4DOS 的 copy 命令的别名:


alias cp copy

要在 Windows PowerShell 里定义别名,可以使用以下命令:


new-alias ci copy-item

以上命令给 Windows PowerShell 的 copy-item 命令定义了一个别名 ci,因此用户在 Windows PowerShell 里输入 ci 时,实际执行的是 copy-item 命令。



历史


Unix 里,alias 命令是由 C shell 引入的,之后也被加入到 tcsh 和 Bash 里。C shell 的别名被严格限制在一行里,复杂的 shell 语言则需要多行,不过单行别名对建立快捷的命令仍然很有用。Bourne shell(sh)里没有别名功能,但它有更强大的 shell 函数方式。Bash 和 Korn shell(ksh)则同时支持函数和别名,并建议在可能时尽量使用函数。



查看当前已定义的别名


要查看当前命令行已定义的别名,可以用以下命令:


alias          # 不带参数运行 alias 命令,可显示当前已定义的别名列表
alias -p # 同上,但在 4DOS/4NT 和 PowerShell 里无效
alias myAlias # 显示指定别名取代的实际命令


忽略别名


在 Unix shells 里,如果别名已经指定过,可以把命令放在引号里,或在前面添加一个反斜杠来使别名定义失效。比如,若已定义了以下别名:


alias ls='ls -la'

要使以上别名失效并强制执行原始的 ls 命令,可使用以下语法:


'ls'



ls

在 4DOS/4NT 命令行里,则可以在命令前面添加星号来使已定义的别名失效,比如,可用以下方式定义别名:


alias dir = *dir /2/p

第二个 dir 命令前的星号,确保其运行的是原始的 dir 命令,避免递归地别名展开,用户还可以运行以下命令,确保运行的是原始(未设定别名的)dir 命令:


*dir


更改别名


在 Windows PowerShell 里,可使用以下命令更改一个已经存在的别名:


set-alias ci cls

运行以上命令后,ci 将变成 cls 命令的别名。





删除别名


在 Unix shell 和 4DOS/4NT 里,别名可以通过 unalias 命令清除:


 unalias copy          # 删除 copy 别名
unalias -a # -a 选项会清除所有已定义的别名,此选项在 4DOS/4NT 里无效

unalias *             # 4DOS/4NT 的清除别名命令,支持通配符

在 Windows PowerShell 里,别名可用以下命令删除:


 remove-item alias:ci  # 删除别名 ci


特性



Chaining


别名通常只替换第一个词,但有些命令行解释器,比如 Bash 和 ksh 允许替换一个字符序列或几个单词,这个特性使用 shell 函数方式是做不到的。


通常的语法是在第一个定义的别名所替换的命令后加一个空格,比如定义以下两个别名:


alias list='ls '      # 注意 ls 后面的空格
alias long='-Flas' # ls 的选项

然后可运行


list long myfile      # 运行时被解释为 ls -Flas myfile

来列出文件详细信息,可见命令行解释器对 long 也进行了别名展开。



别名里的引用


要使用单引号定义一个里面带有单引号的别名,比如要给以下 perl 脚本定义别名:


 $ perl -pe 's/^(.*) foo/$1 bar/;'

你不能这样简单转义:


 $ alias foo2bar='perl -pe 's/^(.*) foo/$1 bar/;'' # 错误:反斜杠并不会对后一个字符进行转义

不过,可以这样:


 $ alias foo2bar='perl -pe '''s/^(.*) foo/$1 bar/;'''' # 把反斜杠放在引号里使之成为 ''

但你可以在双引号里使用单引号。[1]


 $ alias foo2bar='perl -pe '"'"'s/^(.*) foo/$1 bar/;'"'"''

你也可以使用 shell 函数方式,而非使用别名。



命令参数


在 C Shell 里,命令的参数可以通过字符串 !* 嵌入到别名定义里,比如定义以下别名:


alias l-less 'ls !* | less'

然后执行 l-less /etc /usr,命令会被展开成 ls /etc /usr | less,即列出 /etc 和 /usr 两个目录的文件,且满屏后暂停,若没有 !*


alias l-less 'ls | less'

会被展开成 ls | less /etc /usr,这将会错误的试图用 less 打开后两个目录。[2]


Bash 和 Korn shell 里,可以使用 shell 函数做到,参见下文的备选段落。



典型别名


Bash 里一些常用的别名:


alias ls='ls --color=auto' # 输出显示为彩色
alias la='ls -Fa' # 列出所有文件
alias ll='ls -Fls' # 列出文件详细信息

alias rm='rm -i' # 删除前需确认
alias cp='cp -i' # 覆盖前需确认
alias mv='mv -i' # 覆盖前需确认

alias vi='vim' # 输入 vi 命令时使用 vim 编辑器

Windows PowerShell 的标准别名:


new-alias cd set-location

new-alias ls get-childitem
new-alias dir get-childitem

new-alias echo write-output
new-alias ps get-process
new-alias kill stop-process


备选


别名应保持简单,否则应考虑以下备选方式:



  • 命令脚本,通过脚本可以创建新的系统命令。


  • 符号链接,可放在 /usr/local/bin 给所有用户使用,或放在用户自己的 $HOME/bin 目录,只供自己使用。这提供了一个调用命令的新方式,并在某些情况下,对少数支持使用调用名选择操作模式的命令,允许使用其隐含的命令函数。

  • Shell 函数,特别是如果命令需要修改 shell 内部运行环境(如环境变量)、改变当前工作目录、或在非交互 shell 使用情况下出现在搜索路径里面(特别是“较安全的” rmcpmv 版本等等)。

别名最常见的使用方式,是给命令添加常用的选项,这可以使用定义简单 Shell 函数的方式代替:


 alias ll='ls -Flas'              # 列出文件详细信息,别名方式
ll () { ls -Flas "$@" ; } # 列出文件详细信息,Shell 函数方式

ls 本身定义成函数,可以用以下方式定义(注意这是 Bash 的 ls 命令,较老的 Bourne shell 需要使用 /bin/ls 代替):


 ls () { command ls --color=auto "$@" ; }


参考资料




  1. ^ StackOverflow 上的解释


  2. ^ 给别名传递参数的示例 互联网档案馆的存檔,存档日期2012-11-25.



外部链接




  • alias: 定义或显示别名 – 命令与工具(Commands & Utilities)参考,单一UNIX®规范第7期,由國際開放標準組織发布

  • Bash 的 alias 手册页

  • The Linux 信息项目(LINFO)上的 alias 命令

  • 在Linux中设置Alias别名










Popular posts from this blog

Guess what letter conforming each word

Port of Spain

Run scheduled task as local user group (not BUILTIN)