在 bash 腳本中使用時,Bash 函數給出「未找到命令」?

在 bash 腳本中使用時,Bash 函數給出「未找到命令」?

我創建了一個函數aptget並獲取了它的來源:

$ type aptget
aptget is a function
aptget () 
{ 
    sudo apt-get install -y $@
}

以下是腳本的前幾行build.sh

#!/bin/bash

sudo apt remove -y x264 libx264-dev

#aptget build-essential checkinstall cmake pkg-config yasm
aptget git gfortran
aptget libjpeg8-dev libjasper-dev libpng12-dev
aptget libtiff5-dev

aptget libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
aptget libxine2-dev libv4l-dev

當嘗試使用aptgetbash 腳本內部時,找不到它?

在此輸入影像描述

也許我在這裡錯過了一些簡單的東西..這是在ubuntu 18.04。提示讚賞。

答案1

一般來說,shell 函數不應該在定義它們的 shell 之外使用,因此這個答案是對的。然而在 Bash 中你可以這樣做:

export -f aptget

然後你呼叫它build.sh,它應該知道這個函數。這取決於它的解釋器是 的事實bash。一般情況下其他 shell 不會看到該函數。如果您重寫腳本以使用另一個解釋器,您很可能會失去aptget從腳本內部呼叫的能力。

側面一般說明:您的腳本名稱已經具有誤導性,它表明解釋器是sh.假設腳本已經成長,並且您決定是時候重寫它python或其他什麼了。您希望在不更改其名稱的情況下執行此操作,因為也許其他腳本使用它(顯然是透過舊名稱)。因此build.sh這不是一個好名字;build或許。

規範的方法是建立一個名為 的腳本並將其放置在您指向的aptget目錄中。PATH該腳本應該執行您的函數執行的操作。有些函數不能被腳本取代(例如,當它們用於操作呼叫 shell 的變數時),但您的特定函數可以。建立腳本後,將不再需要函數本身。

然後aptget從另一個腳本呼叫應該可以工作。

答案2

Shell 函數不會匯出到子shell。如果您希望 build.sh 能夠存取目前 shell 實例中定義的 shell 函數,則必須取得它,以便它在目前實例中運行。如果您正常呼叫它,則會啟動一個新的 shell 實例來運行它,並且該新的子 shell 將無法存取當前 shell 實例的 shell 函數。

相關內容