Bash
為什麼 sdk 表達式需要在 bash_profile 文件的末尾?考慮到“錯誤”的立場和正常的行為,真的有必要嗎?
在使用了多年的 Linux 之後,我最近開始使用 macOS(OSX 是同一事物的舊名稱)。
在 macOS Monterey 中,
.zshrc
這是預設設置。這是我的.zsh
:#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!! export SDKMAN_DIR="$HOME/.sdkman" [[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"
昨天,我決定將其更改為
bash
,因為它是我習慣的外殼。因此,我通過指向並點擊首選項來做到這一點。這是我的
.bash_profile
:#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!! export SDKMAN_DIR="$HOME/.sdkman" [[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh" export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
正如您在上面看到的,有一條註釋指出 SDKMAN 上的表達式應該位於文件末尾,程序才能正常工作。
有趣的是,我只是在終端上正常使用後才注意到這一點。
sdk
為什麼這是必要的?考慮到該程序已按預期執行,真的有必要
bash_profile
嗎?謝謝
您必須詢問編寫該程式碼的開發人員才能確定,但我的猜測是它不需要是絕對的最後一件事
~/.profile
,它只需要在其他變數定義和設置發生之後。該命令
source "$HOME/.sdkman/bin/sdkman-init.sh"
將讀取腳本sdkman-init.sh
並在目前 shell 中執行其中的任何命令,包括變數定義。因此,如果該腳本假定要定義某些事物,那麼如果它在定義之前就已獲取原始碼,它將失敗。例如,該腳本可能需要在您的目錄中存在一些目錄,
PATH
因此如果您在設置之前獲取PATH
它,它將無法工作。這很可能是開發人員希望您最終擁有它的原因。現在,在您的範例中,sdkman-init.sh
命令之後的唯一內容是關於nvm
所以如果 sdkman 不以任何方式依賴 nvm,那將不是問題。