用户:aleiPhoenix/alias (Unix)
在计算机领域, alias(英语,别名的意思)在命令行解释器、shell、4DOS/4NT和Windows PowerShell里是一个命令,采用一个单词来替代一串字符串。它主要被用来缩略系统命令,或者为常用的命令添加默认的参数。MS-DOS与Microsoft Windows操作系统 中的别名功能则是又DOSKey命令行工具提供的。
一个别名会在shell会话中持续到结束为止。常用的别名都可以在shell的配置文件(对于csh来说是"~/.cshrc"或者系统级别的"/etc/csh.rc",对于bash来说则是"~/.bashrc"或者系统级别的"/etc/bashrc")设置,以在响应的shell会话启动时即可使用。别名命令既可以直接写在配置文件里或者使用source命令从另外一个单独的文件引用,名字一般是.alias(如果有使用多个shell,也可能是.alias-bash、.alias-csh等等)。
创建别名
可以通过给alias命令传递"名字/值"的成对参数来创建别名。Bash中的语法示例如下:
alias copy="cp"
alias copy "cp"
这个别名意味着当shell中接收到copy
命令,则会被替换为cp
并加以执行。
下面这个命令语法则表示在4DOS/4NT中将cp
定义为4DOS命令copy
的别名:
alias cp copy
在Windows PowerShell中创建一个别名,可以连同动词new
与名为alias
的cmdlet一起使用:
new-alias ci copy-item
这句命令创建了一个叫做ci
的别名来替代原本执行copy-item
的cmdlet。
历史
在Unix中,别名首次在C Shell中被引入并且成功在tsch和Bash中沿袭下来。C shell中的别名被严格限制为只能使用一行,而shell语言中复杂的结构则完全不能满足,然而即使如此alias命令仍旧对创建简单的快捷命令很有用。别名却在工具繁多、功能强大的Bourne shell中缺席。别名的概念被导入到Bourne Again Shell(bash)与Korn shell(ksh)中。这类shell中,同时支持函数与别名,而更推荐使用函数。此外bash与ksh有必要的情况下,还可以使用别名的嵌套。
查看已定义的别名
如欲查看已经定义的别名,可以使用如下的命令:
alias # 不带任何参数;列出所有已定义的别名 alias -p # 与上一条类似;在4DOS/4NT和PowerShell中不可用 alias myAlias # 显示单条定义的别名内容
Overriding aliases
In Unix shells, if an alias exists for a command, it is possible to override the alias by surrounding the command with quotes or prefixing it with a backslash. For example, consider the following alias definition:
alias ls='ls -la'
To override this alias and execute the ls
command as it was originally defined, the following syntax can be used:
'ls'
or
\ls
In the 4DOS/4NT shell it is possible to override an alias by prefixing it with an asterisk. For example, consider the following alias definition:
alias dir = *dir /2/p
The asterisk in the 2nd instance of dir
causes the unaliased dir
to be invoked, preventing recursive alias expansion. Also the user can get the unaliased behaviour of dir
at the command line by using the same syntax:
*dir
Changing aliases
In Windows PowerShell, the set
verb can be used with the alias
cmdlet to change an existing alias:
set-alias ci cls
The alias ci
will now point to the cls
command.
In the 4DOS/4NT shell, the eset
command provides an interactive command line to edit an existing alias:
eset /a cp
The /a
causes the alias cp
to be edited, as opposed to an environment variable of the same name.
Removing aliases
In Unix shells and 4DOS/4NT, aliases can be removed by executing the unalias
command:
unalias copy # Removes the copy alias unalias -a # The -a switch will remove all aliases; not available in 4DOS/4NT unalias * # 4DOS/4NT equivalent of `unalias -a` - wildcards are supported
In Windows PowerShell, the alias can be removed from the alias:\ drive using remove-item
:
remove-item alias:ci # Removes the ci alias
Features
Chaining
An alias usually replaces just the first word. But some shells, such as bash and ksh allow a sequence or words to be replaced; this particular feature is unavailable through the function mechanism.
The usual syntax is to define the first alias with a trailing space character. For instance, using the two aliases:
alias list='ls ' # note the trailing space to trigger chaining alias long='-Flas' # options to ls for a long listing
allows:
list long myfile # becomes ls -Flas myfile when run
for a long listing, where "long" is also checked for being an alias.
Quoting quotes
To define an alias with single quotes, which itself needs to contain single quotes, you need to use several concatenated quoted strings. For example, to define an alias which would do:
perl -pe 's/^(.*) foo/$1 bar/;'
You cannot do
alias foo2bar='perl -pe \'s/^(.*) foo/$1 bar/;\'' # WRONG: backslashes do not escape the next character inside single quotes
But you can use single quotes quoted inside double quotes
alias foo2bar='perl -pe '"'"'s/^(.*) foo/$1 bar/;'"'"'
See this explanation.
You may also consider using a function instead of an alias.
Typical aliases
Some commonly used, but deprecated, aliases in the Bash shell:
alias ls='ls --color=auto' # use colors alias la='ls -Fa' # list all files alias ll='ls -Fls' # long listing format alias rm='rm -i' # prompt before overwrite (but dangerous, see Rm for a better approach) alias cp='cp -i' # prompt before overwrite (same general problem as the rm) alias mv='mv -i' # prompt before overwrite (same general problem as the rm) alias vi='vim' # use improved vi editor
Standard aliases of Windows PowerShell include:
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
Alternatives
Aliases should usually be kept simple. Where it would not be simple, the recommendation is usually to use one of the following:
- Shell scripts, which essentially provide the full ability to create new system commands.
- Symbolic links, either in /usr/local/bin if for all users, or in a users $HOME/bin directory if for personal use. This method is useful for providing an additional way of calling the command, and in some cases may allow access to a buried command function for the small number of commands that use their invocation name to select the mode of operation.
- Shell functions, especially if the command being created needs to modify the internal runtime environment of the shell itself (such as environment variables), needs to change the shell's current working directory, or must be implemented in a way which guarantees they it appear in the command search path for anything but an interactive shell (especially any "safer" version of rm, cp, mv and so forth).
The most common form of aliases, which just add a few options to a command and then include the rest of the command line, can be converted easily to shell functions following this pattern:
alias ll='ls -Flas' # long listing, alias ll () { ls -Flas "$@" ; } # long listing, function
To make ls itself a function (note that "command ls" is Bash-specific, and that older Bourne shells would have used "/bin/ls" instead):
ls () { command ls --color=auto "$@" ; }
External links
- 单一UNIX®规范第7期,由国际开放标准组织发布 : define or display aliases – 命令与工具(Commands & Utilities)参考,
- Bash man page for alias
- The alias Command by The Linux Information Project (LINFO)