为什么 sdk 表达式需要位于 bash_profile 文件的末尾?真的有必要考虑“错误”的立场和正常的行为吗?

为什么 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,因为这是我习惯的 shell。因此,我通过指向并单击首选项来完成此操作。

这是我的.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

谢谢

答案1

您必须询问编写该代码的开发人员来确定,但我的猜测是它不需要是绝对的最后一件事~/.profile,它只需要在其他变量定义和设置发生之后即可。

该命令source "$HOME/.sdkman/bin/sdkman-init.sh"将读取脚本sdkman-init.sh并在当前 shell 中运行其中的任何命令,包括变量定义。因此,如果该脚本假设要定义某些内容,那么如果在定义这些内容之前获取它,它将失败。

例如,该脚本可能需要一些目录位于您的目录中PATH,因此如果您在设置之前获取它PATH,它将无法工作。这很可能就是开发人员希望你最终拥有它的原因。现在,在您的示例中,命令之后的唯一内容sdkman-init.shnvm,如果 sdkman 不以任何方式依赖于 nvm,那么这不会成为问题。

答案2

(我基本上在这里重复了 terdon 的部分答案)

开发人员要求将他们的操作放置在 shell 启动文件的末尾,例如~/.profile或 ,~/.bashrc因为他们不希望文件中已有的其他操作覆盖他们的操作。

由于软件开发商X不知道您的 shell 启动文件中还有哪些其他操作,他们可以给您的最安全的建议是将其操作添加到最后。

相关内容