Shell
有沒有辦法導出參數已經擴展的函式?
假設我在同一個文件夾中有兩個文件main.sh和sub.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"