如何在 bash 中「導出」函數?

如何在 bash 中「導出」函數?

我有一個腳本,裡面有很多函數。

myfile1.sh:

func1() {}

func2() {}

我可以透過腳本調用它們:

myfile2.sh:

source myfile1.sh

func1

func2

但是,如果源自嵌套腳本,我該如何呼叫它們?

myfile3.sh:

./myfile2.sh

func2

func2: command not found

我可以“導出”函數myfile2以便每個人都知道它們嗎?

我無法使用,export -f因為有很多功能。

答案1

注意,bash不是shexport -f是特定於bash外殼的。

如果腳本沒有 she-bang,它將由類似 POSIX 的 shell 解釋,該 shell 可能不是 bash。如果您打算bash在腳本中使用特定功能,則應確保它具有:

#! /path/to/bash -

she-bang 或您將其呼叫為bash path/to/the/script.另外,.sh對用該語言編寫的腳本進行擴充也bash有點誤導。

Nowbash是少數能夠將函數匯出到環境的 shell 之一(實際上使用bash僅由命令理解的特殊環境變數)。可以使用export -f特定於 bash 的命令來完成。還導出該選項打開bash時聲明的所有函數。allexport

但無論如何,這些都不適合你的情況。export從一個 shell 中取得某些內容,無論是變數還是函數,以便該變數/函數在該 shell 的其他 shell 中可用執行(出口是為了保存東西執行)。

因此,即使myfile1.shmyfile2.sh匯出它們聲明的函數(在變數聲明之前帶有export -f或透過set -o allexport變數聲明),也只會影響解釋這些腳本的 shell 將執行的 shell。這裡myfile2.sh不是執行myfile3.sh,而是相反。

在這裡你需要你的myfile3.sh腳本來做:

source path/to/myfile2.sh

這樣,它就是解釋所有myfile1.shmyfile2.shmyfile3.sh腳本中的程式碼的同一個 shell,然後您就不需要匯出任何函數。

sh請注意,在is 的系統上bash,導出函數可能不是一個好主意,因為這會影響腳本執行(遞歸)的所有 sh 和 bash 腳本以及 shell 命令列。例如,如果您這樣做:

set -o allexport
uname() { echo Gotcha; }
somecmd

並且somecmd正在做一個popen("uname", "r")來獲取unix名稱,它會Gotcha在系統上而sh不是bash系統的真實名稱(DarwinLinux...)。

相關內容