
我創建了一個函數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
當嘗試使用aptget
bash 腳本內部時,找不到它?
也許我在這裡錯過了一些簡單的東西..這是在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 函數。