Contents

运行别名命令

1.概述

Shell 程序通常实现命令别名 功能,即当命令的别名存在时,Shell 替换命令的第一个单词。当命令冗长或频繁使用时,这可以方便地节省一些键盘敲击。

当别名共享相同名称时,别名可能会隐藏现有命令。在这种情况下,我们需要依靠变通方法来消除命令的歧义。

在本教程中,我们将快速介绍使用别名的一些非常基本的用法,然后我们将研究几种不同的方法来运行被别名遮蔽的命令。

2. 别名

2.1. 命令别名

**最常见的别名形式是命令别名,它是命令中第一个单词的文本替换。**让我们创建一些虚拟目录和文件并隐藏ls命令:

$ { mkdir -p a b c; touch e f g; }
$ alias ls='echo foobar'
$ ls
# foobar

我们可以使用一个简单的别名alias列出 shell 会话中的别名:

$ alias
# alias ls='echo foobar'

2.2. 全局别名

在 zsh shell 中,我们还可以使用另一种形式的别名,称为全局别名,以替换输入中任何位置的文本:

$ alias -g t='foobar'
$ echo t
# foobar

3. 避免别名替换

有时我们希望 shell 在解释命令时忽略别名。我们可以使用几种不同的方法来解决阻碍别名的问题。 接下来,让我们看看如何使用这些不同的技术来解决我们在前面部分中配置的ls别名。

3.1. unalias

**一个简单的unalias ls将从我们的 shell 会话中删除ls别名,**我们将能够调用先前隐藏的命令:

$ unalias ls
$ ls
# a  b  c  e  f  g

虽然是一种简单的解决方法,但这种方法的缺点是我们将丢失 shell 会话中的别名。

3.2. 引用

**另一种技术是通过“引用”命令从命令中删除特殊含义。**只要字符串中的任何字符被引用,命令就会被视为引用。让我们看看引用命令的三种不同方式。 首先,我们可以使用转义字符(\)来保留命令的字面意思:

$ \ls
# a b c e f g

另一种选择是使用单引号 ('...') 来引用命令:

$ 'ls'
# a b c e f g

我们可以使用双引号(”...”)来引用命令:

$ "ls"
# a b c e f g

引用是一个较少讨论的 shell 概念,有几点需要指出。我们应该知道,没有必要引用整个命令,以便 shell 将命令视为已引用。以下引用变体同样“引用” ls命令:

$ l\s
# a b c e f g
$ l's'
# a b c e f g
$ l"s"
# a b c e f g

我们还应该注意不要将别名与 shell 函数混淆,因为 shell 函数是常规命令,因此引用它们不会有任何效果:

$ function foobar () { echo helloworld; }
$ foo\bar
# helloworld

3.3. *command *(内置)

自命名的内置command 可用于将命令的解释范围缩小到**仅在$PATH或 shell 内置目录中找到的可执行文件。**让我们看看如何使用command忽略ls别名:

$ command ls
# a b c e f g

3.4. 绝对路径

当别名隐藏可执行文件时,一个简单的解决方案是简单地将可执行文件的完整路径名指定command。**我们可以使用一些工具在$PATH 目录中找到可执行文件:

我们可以使用which 在我们的*$PATH中搜索与提供的文件名匹配的可执行文件。如果找不到可执行文件,那么它将*以退出代码 1 终止。让我们看看实际情况:

$ which ls
# /usr/bin/ls
$ which foobar
$ echo $?
# 1

我们还可以使用type 内置命令来了解 shell 如何解释命令:

$ type -a ls
# ls is aliased to `ls --color=auto'
# ls is /usr/bin/ls
# ls is /bin/ls