當我定義 bash 函數以使用程式名稱時,我應該知道什麼?

當我定義 bash 函數以使用程式名稱時,我應該知道什麼?

在許多情況下,我需要建立與其他程式同名的函數,並且我不知道這是否是使用 bash 腳本的好方法。

例子:

    function echo () {
        echo -n "$@" ;
    }  

測試後看起來它會在 bin 路徑之前檢查腳本內的函數名稱。我想確定這一點以及我應該知道的任何其他資訊。

答案1

echo() {
  command echo -n "$@"
}

在這裡使用command意味著請求echo命令(恰好是內建的)而不是函數,否則函數會優先。

由於這裡,也恰好是一個內建命令(順便說一句,由於內建命令優先於檔案系統命令,所以echo不會在其中查找),您也可以這樣做:$PATH

echo() {
  builtin echo -n "$@"
}

後一種方法在 中更可取zshcommand echo將在其中運行/bin/echo(仿真除外sh)。

shell 之間存在一些細微的差異,但優先順序通常是:

  1. 特殊的內建函數
  2. 功能
  3. 內建函數
  4. 命令$PATH(且順序取決於內建命令管理的表中$PATH和表中的順序)hashhash

請記住,shell 語法中的別名和關鍵字 ( for, if...) 如果未加引號,則將被視為在這些別名和關鍵字之前。

在某些 shell 中,1和的順序是相反的,例如或。當作為 呼叫時,不允許使用與特殊內建函數相同的名稱來定義函數。2bashzshbashsh

相關內容