Unix

如何將 VAR 從子 shell 導出到父 shell?

  • September 21, 2015

我有一個 Korn shell 腳本

#!/bin/ksh
# set the right ENV
case $INPUT in
abc)
 export BIN=${ABC_BIN}
 ;;
 def)
 export BIN=${DEF_BIN}
 ;;
 *)
 export BIN=${BASE_BIN}
 ;;
esac
# exit 0 <- bad idea for sourcing the file

現在這些 VAR 僅在子 shell 中導出,但我希望它們也設置在我的父 shell 中,所以當我在提示符處時,這些 var 仍然設置正確。

我知道

. .myscript.sh

但是有沒有辦法在沒有“採購”的情況下做到這一點?因為我的使用者經常忘記“來源”。


EDIT1:刪除“exit 0”部分 - 這只是我打字沒有先考慮

EDIT2:添加更多關於我為什麼需要這個的詳細資訊:我的開發人員為(為簡單起見)2 個應用程序編寫程式碼:ABC 和 DEF。每個應用程序都由單獨的使用者 usrabc 和 usrdef 在生產中執行,因此設置了他們的 $ BIN, $ CFG、$ORA_HOME 等等——特定於他們的應用程序。

所以

  • 美國廣播公司 $ BIN = /opt/abc/bin # $ 上面腳本中的 ABC_BIN
  • DEF的 $ BIN = /opt/def/bin # $ DEF_BIN

等等。

現在,在開發盒上,開發人員可以在他們自己的使用者帳戶“justin_case”下同時開發 ABC 和 DEF,我讓他們獲取文件(上圖),以便他們可以來回切換他們的 ENV var 設置。( $ BIN should point to $ ABC_BIN 一次,然後我需要切換到 $ BIN= $ DEF_BIN)

現在,該腳本還應該為同一應用程序的並行開發創建新的沙箱等。這使我可以互動地執行此操作,詢問沙箱名稱等。

  • /home/justin_case/sandbox_abc_beta2
  • /home/justin_case/sandbox_abc_r1
  • /home/justin_case/sandbox_def_r1

我考慮過的另一個選擇是編寫別名並將它們添加到每個使用者的個人資料中

  • 別名’setup_env=。.myscript.sh'

並執行它

  • setup_env 參數 1 … 參數 X

現在這對我來說更有意義

我認為這是一個“不能做”的問題……

首先——你不想獲取那個腳本,因為最後是 exit 0 。

其次,沒有unix子程序可以直接改變父程序的環境。否則各種瘋狂的事情都是可能的。

您可以使用預設配置文件或 bashrc 文件在他們的環境中添加一些東西,或者您可以為他們嘗試執行的任何程序編寫一個包裝器嗎?

請允許我詳細說明“包裝器”的概念。

假設您想在環境變數“OPTIONS”中使用 PROD 或 DEV 執行程序 snoopy,具體取決於您是要生產還是開發。如果沒有設置,假設 snoopy 做了一些滑稽的事情,比如清除數據庫以進行生產和開發……

將“snoopy”重命名為 snoopy.bin(或 .snoopy.bin)

然後在同一位置放置一個名為“snoopy”的腳本,其中包含以下內容:

#!/bin/sh

export OPTIONS

case "$OPTIONS" 
in
 PROD) ;;
 DEV) ;;
 *) OPTIONS=DEV ;;
esac

#the binary is actually named snoopy.bin 

exec "$0.bin" "$@"

如果您不想使用實際文件,請將此腳本放在文件系統中的某個位置,該文件將在使用者的 PATH 中實際 snoopy 程序之前,並在腳本的 exec 語句中具有二進製文件的完整路徑…

引用自:https://serverfault.com/questions/37796