我有一個腳本,裡面有很多函數。
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
不是sh
。export -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.sh
或myfile2.sh
匯出它們聲明的函數(在變數聲明之前帶有export -f
或透過set -o allexport
變數聲明),也只會影響解釋這些腳本的 shell 將執行的 shell。這裡myfile2.sh
不是執行myfile3.sh
,而是相反。
在這裡你需要你的myfile3.sh
腳本來做:
source path/to/myfile2.sh
這樣,它就是解釋所有myfile1.sh
、myfile2.sh
和myfile3.sh
腳本中的程式碼的同一個 shell,然後您就不需要匯出任何函數。
sh
請注意,在is 的系統上bash
,導出函數可能不是一個好主意,因為這會影響腳本執行(遞歸)的所有 sh 和 bash 腳本以及 shell 命令列。例如,如果您這樣做:
set -o allexport
uname() { echo Gotcha; }
somecmd
並且somecmd
正在做一個popen("uname", "r")
來獲取unix名稱,它會Gotcha
在系統上而sh
不是bash
系統的真實名稱(Darwin
,Linux
...)。