Bash

為什麼 sdk 表達式需要在 bash_profile 文件的末尾?考慮到“錯誤”的立場和正常的行為,真的有必要嗎?

  • August 2, 2022

在使用了多年的 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,那將不是問題。

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