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/;'\''' # 把反斜杠放在引号里使之成为 '\'
但你可以在雙引號里使用單引號。[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 使用情況下出現在搜尋路徑裡面(特別是「較安全的」 rm,cp,mv 版本等等)。
別名最常見的使用方式,是給命令添加常用的選項,這可以使用定義簡單 Shell 函式的方式代替:
alias ll='ls -Flas' # 列出文件详细信息,别名方式
ll () { ls -Flas "$@" ; } # 列出文件详细信息,Shell 函数方式
把 ls 本身定義成函式,可以用以下方式定義(注意這是 Bash 的 ls 命令,較老的 Bourne shell 需要使用 /bin/ls 代替):
ls () { command ls --color=auto "$@" ; }
參考資料
- ^ StackOverflow 上的解释. [2014-03-23]. (原始內容存檔於2013-07-03).
- ^ 给别名传递参数的示例. [2014-03-23]. (原始內容存檔於2012-11-25).
外部連結
- 單一UNIX®規範第7期,由國際開放標準組織發布 : 定義或顯示別名 – 命令與工具(Commands & Utilities)參考,
- Bash 的 alias 手冊頁(頁面存檔備份,存於網際網路檔案館)
- The Linux 資訊專案(LINFO)上的 alias 命令
- 在Linux中設定Alias別名(頁面存檔備份,存於網際網路檔案館)