DOSKey

在電腦運算中，**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 命令執行該檔案來設定。

## 定義別名

別名可以使用給 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 *             # 4DOS/4NT 的清除别名命令，支持通配符
```

在 Windows PowerShell 里，別名可用以下命令刪除：

## 特性

### Chaining

別名通常只替換第一個詞，但有些命令列直譯器，比如 Bash 和 ksh 允許替換一個字元序列或幾個單詞，這個特性使用 shell 函式方式是做不到的。

通常的語法是在第一個定義的別名所替換的命令後加一個空格，比如定義以下兩個別名：

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

然後可執行

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

來列出檔案詳細資訊，可見命令列直譯器對 long 也進行了別名展開。

### 別名里的參照

要使用單引號定義一個裡面帶有單引號的別名，比如要給以下 perl 指令碼定義別名：

你不能這樣簡單跳脫：

不過，可以這樣：

但你可以在雙引號里使用單引號。

你也可以使用 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 打開後兩個目錄。

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 使用情況下出現在搜尋路徑裡面（特別是「較安全的」 rm，cp，mv 版本等等）。

別名最常見的使用方式，是給命令添加常用的選項，這可以使用定義簡單 Shell 函式的方式代替：

把 **ls** 本身定義成函式，可以用以下方式定義（注意這是 Bash 的 ls 命令，較老的 Bourne shell 需要使用 /bin/ls 代替）：

## 參考資料

## 外部連結

* `alias`: 定義或顯示別名 – 命令與工具（Commands & Utilities）參考，單一 UNIX® 規範第 7 期，由國際開放標準組織發布
* Bash 的 alias 手冊頁（頁面存檔備份，存於網際網路檔案館）
* The Linux 資訊專案（LINFO）上的 alias 命令
* 在 Linux 中設定 Alias 別名（頁面存檔備份，存於網際網路檔案館）