
我有一個 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 中設置,因此當我出現提示時,這些變數仍然設置正確。
我知道關於
. .myscript.sh
但有沒有一種方法可以在不「採購」的情況下做到這一點?因為我的用戶經常忘記「來源」。
EDIT1:刪除“exit 0”部分 - 這只是我在沒有先思考的情況下輸入的
編輯2:添加更多關於為什麼我需要這個的細節:我的開發人員為(為了簡單起見)2個應用程式編寫程式碼:ABC和DEF。每個應用程式都由單獨的用戶 usrabc 和 usrdef 在生產中運行,因此設定了他們的 $BIN、$CFG、$ORA_HOME 等 - 特定於他們的應用程式。
所以
- ABC 的 $BIN = /opt/abc/bin # 上述腳本中的 $ABC_BIN
- DEF 的 $BIN = /opt/def/bin # $DEF_BIN
ETC。
現在,在開發盒上,開發人員可以在自己的使用者帳戶「justin_case」下同時開發 ABC 和 DEF,我讓他們取得檔案(上面),以便他們可以來回切換 ENV var 設定。 ($BIN 應該一次指向 $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
現在這對我來說更有意義了
答案1
我認為這是一個“無能為力”的問題...
首先,您不想取得該腳本的源代碼,因為末尾有 exit 0。
其次,沒有任何unix子程序可以直接改變父行程的環境。否則各種瘋狂的事情都有可能發生。
您可以使用預設設定檔或 bashrc 檔案為他們的環境添加一些內容,或者您可以為他們嘗試運行的任何程式編寫包裝器嗎?
請容許我詳細說明“包裝器”的概念。
假設您想在環境變數「OPTIONS」中使用 PROD 或 DEV 執行程式 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" "$@"
如果您不想弄亂實際文件,請將此腳本放在檔案系統中的某個位置,該位置將位於使用者路徑中的實際snoopy 程式之前,並在腳本的exec 語句中提供二進位檔案的完整路徑.. .
答案2
答案是採購。 Sourcing 允許您在腳本中包含變數目前的shell,但從來不是它的父級。確實,您必須小心不要使用任何退出命令或類似命令,因為這會關閉目前的 shell。
您可以使用“.”來取得腳本,即
。 ./myscript.ksh
答案3
也許如果你嘗試...
#!/bin/bash
mknod fifo p
(
echo 'value' > fifo &
)
VARIABLE=`cat fifo`
rm fifo
它不完全是變數導出,但它可以提供與父進程的基本通訊。
答案4
好吧,現在別笑。非常快速且非常骯髒的解決方案是添加
echo "Please copy and paste this command:"
echo ""
echo "export BIN=\"$BIN\""
到你的腳本。
另一種方法。只是exec
腳本中的從屬 $SHELL,可能有不同的提示(更改 $PS1 以通知用戶他們正在哪個環境下工作以減少混亂)。
另一種方法(我最喜歡的)。用戶忘記獲取您的腳本的來源,這是為什麼?採購正是標準的方式。也許提醒他們的一個好方法是刪除第一行 ( #!/bin/sh
),然後chmod a-x
刪除它。之後仍然可以獲得,但顯然不能錯誤執行。
咆哮: 總而言之,我覺得你一開始就有一個奇怪的想法。也許不奇怪…我想說的是有點非 Unix 風格。我一生中從來沒有需要向父母輸出環境。我曾經看到過類似的情況 - 登入 .profile 詢問為單一 oracle 帳戶設定三種不同環境中的哪一種。壞主意,最終結果證明用戶更喜歡遷移到 sudo(他們 sudo 到三個不同的 oraxxx 帳戶)。如果我可以問的話,你想達成什麼目標?