Shell

有沒有辦法導出參數已經擴展的函式?

  • November 29, 2021

假設我在同一個文件夾中有兩個文件main.shsub.sh ,內容如下:

main.sh:

#!/usr/bin/env bash

export PARAMETER="main"
my_func(){
 echo "$PARAMETER $1"
}
export -f my_func

# Run the other script
./sub.sh

sub.sh:

#!/usr/bin/env bash

PARAMETER="sub"
my_func $PARAMETER

如果我們執行 main.sh,它會輸出sub sub,但我希望它輸出main sub

有沒有辦法讓 main.sh 中定義的函式始終使用 main.sh 中聲明的值,而不限制在 main.sh 啟動的腳本中使用該參數名稱?我正在尋找不需要修改 sub.sh 的解決方案,因為在我的現實生活問題中,有很多類似 sub.sh 的函式。

編輯:

雖然我已經回答了我的問題,但這裡有一點背景:

main.sh是 docker 圖像的入口點腳本。這個入口點基本上是一個大的 case 語句,並sub.sh根據$1.

我正在考慮創建一個實用程序函式main.sh以避免在sub.sh腳本中重新鍵入重複的常式。我不是唯一一個將類似 sub.sh 的腳本添加到圖像中的人,這就是為什麼我想避免接觸這些腳本的原因——我想給其他開發人員一個工具,而他們不需要知道它。

我的第一個想法是將 的值複製PARAMETER到具有唯一名稱的參數中,例如my_func_PARAMETER. 這很可能確保該功能始終按預期工作。那時我想到是否可以導出具有已擴展參數的函式。

您可以創建具有已擴展參數的函式。而且您可以稍後(全域或在子shell中)覆蓋它們,您可以“使用已經擴展的參數導出它們”。

#!/usr/bin/env bash

export PARAMETER="main"

eval "my_func(){
 echo \"$PARAMETER \$1\"
}"

export -f my_func

# Run the other script
./sub.sh

或者

#!/usr/bin/env bash

export PARAMETER="main"

my_func(){
 echo "$PARAMETER $1"
}

export -f my_func

# Run the other script
(
eval "my_func(){
 echo \"$PARAMETER \$1\"
}"

./sub.sh
)

顯然這沒有多大意義。As 在您想要使用其舊內容之前不會覆蓋變數。

#!/usr/bin/env bash

LOCAL_PARAMETER="sub"
my_func "$LOCAL_PARAMETER"

引用自:https://unix.stackexchange.com/questions/679219