在 Bash 中包裝別名
將舊的 .cshrc 文件轉換為 .bash_aliases 文件。我遇到了一些關於轉換的語法問題,但這涉及到對 Bash 的更深入的了解。
在
$$ t $$Csh,當打開 xwindow 應用程序時,shell 會掛起,除非它們是在後台使用 & 符號打開的(例如,
firefox &)
。為了避免這種情況,我會在 Csh 中創建某些別名以在後台執行任務,但仍然離開命令行打開選項(使用\!*
):alias ff 'firefox \!* &
當它轉換為 Bash 時,它會執行以下操作:
ff () { command ff "$@" & }
我仍然不確定何時使用函式以及何時使用alias,但是當我嘗試將更多選項包裝在已定義的別名周圍時,我陷入了困境:
win () { command xterm -geometry 105x25 -font 8x13 -bc "$@" & } blue () { command win -bg gray33 -fg gray39 "$@" ; }
如果我刪除藍色內的命令(例如,),它會按預期工作。
blue () { win -bg ...
所以我很好奇兩件事:
- 何時使用別名與函式定義?
- 何時使用命令;如果我這樣做了
alias win='xterm ...'
,我必須這樣做command win
嗎?
一,將函式用於任何不平凡的事情;一個簡單的別名是預設設置一些標誌:
# no license spam alias gdb='gdb -q'
對於幾乎任何更複雜的事情,我都會使用一個函式。
二、
command
指命令,如/bin/ls
或之類的;別名不是命令,函式命令也不是。您可能沒有win
命令,因此command win
將無法呼叫該函式,因為這不是命令。順便說一句,“無限”循環真的很容易創建
alias fooalias=foofunc function foofunc() { fooalias; }
這就是為什麼如果一個人正在編寫一個與命令同名的函式,那麼
command
它會變得非常方便,因此 shell 不會嘗試永遠呼叫該函式:# loops until stack death or segfault or something function xterm() { xterm ... } # good function xterm() { command xterm ... }
如果您只是想讓其他函式呼叫可能是命令或函式的其他函式,請按原樣呼叫它。確實需要呼叫命令的必須使用
command
.function winwinwin () { winwin ... } function winwin () { win ... } function win () { xterm ... } function xterm () { command xterm ... }
winwinwin
將呼叫該winwin
函式將呼叫該win
函式將呼叫該xterm
函式然後將改為呼叫命名的command
.在
function
前面,這是可選的,但我使用它,因為它使搜尋函式變得相當容易(fgrep function ...
)而不是必須尋找可能後面跟著空格和錯誤的東西,嗯,是否需要在我正在使用的正則表達式引擎中轉義括號?對於優先級,很容易進行測試或列印顯示正在發生的事情的通知:ls () { ls -k; echo funcall; } alias ls='echo blat' ls
一般來說,首先定義函式,然後設置別名可能是一個更好的主意,至少令人驚訝:
bash-4.1$ alias ls='echo blat' bash-4.1$ ls () { command ls -k; echo funcall; } bash: syntax error near unexpected token `(' bash-4.1$ function ls () { command ls -k; echo funcall; } bash-4.1$