在使用 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.sh
是nvm
,如果 sdkman 不以任何方式依赖于 nvm,那么这不会成为问题。
答案2
(我基本上在这里重复了 terdon 的部分答案)
开发人员要求将他们的操作放置在 shell 启动文件的末尾,例如~/.profile
或 ,~/.bashrc
因为他们不希望文件中已有的其他操作覆盖他们的操作。
由于软件开发商X不知道您的 shell 启动文件中还有哪些其他操作,他们可以给您的最安全的建议是将其操作添加到最后。