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 命令執行該文件來設定。

**定義別名**
別名可以使用給 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/;'\ # 把反斜槓放在引號裡使之成為 '\'
但你可以在雙引號裡使用單引號。
$ 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 打開後兩個目錄。
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 函數的方式代替：
alias ll='ls -Flas'              # 列出文件詳細信息，別名方式
ll () { ls -Flas "$@" ; }        # 列出文件詳細信息，Shell 函數方式
把 ls 本身定義成函數，可以用以下方式定義（注意這是 Bash 的 ls 命令，較老的 Bourne shell 需要使用 /bin/ls 代替）：
ls () { command ls --color=auto "$@" ; }

**參考資料**

**外部鏈接**
定義或顯示別名- Bash 的 alias 手冊頁date=20140323121703 
*The Linux 信息項目（LINFO）上的  alias 命令- 在Linux中設置Alias別名date=20190215122822