標籤:

bash alias怎麼解析傳入的參數的?

我嘗試寫了三個alias,$1為一個文件名(xxd的作用是將文件以16進位的方式顯示出來)

alias a="xxd -l 80 $1"
alias b="xxd -l 80 $1 | head"
alias c="xxd -l 80 file | head" # 直接指定文件名

1.輸入a file,的確會將file內容以16進位顯示出來。

2.輸入b file,顯示出來的內容為file的原文,並且程序一直在運行,必須按ctrl + c才能停下來。

3.輸入c,得到的結果為16進位顯示的file文件。

4.如果輸入a file | head,顯示出來的仍為16進位的結果。

請問一下,出現第2點的原因是什麼?


alias 不支持參數,function 才支持。

出現第2點是因為,它執行的是 xxd -l 80 | head file,head file 會輸出 file 的前十行內容。你沒給 xxd 文件名,所以它默認從標準輸入讀取數據。你隨便輸入點東西並回車 xxd 就會給你轉換,按 Ctrl-D 讓 xxd 讀到文件結束(EOF)它就會停止執行。


bash 的 alias 確實不支持參數,tcsh 的支持。

先說 bash 的解決辦法:用 function

alias a=_a(){ xxd -l 80 $1 | head; }; _a
$ a FILE # xxd -l 80 FILE | head

  • 大致思路就是,將 alias 的內容定義成一個函數,由這個函數來處理輸入的參數,最後在結尾處調用這個函數。

function a(){
xxd -l 80 $1 | head;
}
$ a FILE

  • 更簡單的辦法,就是不要 alias,直接定義 a(),然後直接使用。
    • 由於 alias 的優先順序比較高,所以如果與當前某 alias 重名,在不重啟當前 shell 的情況下,需要 unalias 舊名字。
    • 無法用 alias a 來查看具體語句。

同樣的效果,tcsh 的實現:

alias a xxd -l 80 !:1 | head # !:1 是 CShell 的 alias argument


alias 不支持參數,function 才支持。

以快速運行 "grep --help" 為例, 有了以下alias運行「h grep」就可以了:

alias h=help_fun(){ $@ --help | less ;};help_fun $1


推薦閱讀:

20.7 輸入輸出重定向 (從新手到菜鳥的Linux教程)
20.4 Shell 字元串 (從新手到菜鳥的Linux教程)
20.8 別名 (從新手到菜鳥的Linux教程)
如何評價 Windows 版「bash」(及其相關 *nix 子系統)?

TAG:Linux | Bash |