Bash

在 Bash 中包裝別名

  • October 6, 2016

將舊的 .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 ...


所以我很好奇兩件事:

  1. 何時使用別名與函式定義?
  2. 何時使用命令;如果我這樣做了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$ 

引用自:https://unix.stackexchange.com/questions/314818