每次登录 SSH 时,我都必须手动获取 bashrc 文件以按我想要的方式设置路径变量。如何让 bash 自动执行此操作?它不应该是自动的吗?
答案1
有一个~/.profile
(或~/.bash-profile
) 文件,每次登录时都会运行。您应该在那里设置环境变量(使用命令export
)。还有一个~/.bashrc
文件,每次打开 shell 时都会运行。没有被所有子 shell 继承的命令(如别名)可以在这里设置(但为了良好实践,别名应该在 中设置~/.aliases
,它由 自动提供~/.bashrc
)。
如果不起作用,则可能是您使用了错误的文件名(开头缺少“。”),或者您没有使用 bash 作为 shell。在后一种情况下,请尝试passwd -s /bin/bash
(或chsh -s /bin/bash
,取决于操作系统),或者按以下方式调用 SSH:
ssh username@host bash`
答案2
您还应该了解 $BASH_ENV 。
bash 启动时读取哪些文件取决于会话是否为交互式。有时可能会出现不清楚会话是否为交互式的问题。因此,除了 ~/.bashrc 之外,您可能还想导出并设置变量 BASH_ENV 以指向包含 PATH 和其他所需设置的文件。只要其中没有交互式命令(为安全起见,请使用单独的文件,例如 ~/.bash_env),就可以将 BASH_ENV 设置为指向您的 .bashrc 文件(有时是 .bash_rc)。摘自 bash 手册页:
当启动非登录 shell 的交互式 shell 时,如果 ~/.bashrc 文件存在,bash 将从该文件中读取并执行命令。可以使用 --norc 选项禁止此操作。--rcfile 文件选项将强制 bash 从文件而不是 ~/.bashrc 中读取并执行命令。
例如,当以非交互方式启动 bash 以运行 shell 脚本时,它会在环境中查找变量 BASH_ENV,如果该变量存在,则展开其值,并使用展开的值作为要读取和执行的文件的名称。Bash 的行为就像执行了以下命令一样:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
但PATH变量的值不用于搜索文件名。
答案3
我知道这已经过时了,但我认为在新的登录 shell 上,bash 会寻找要运行的单个文件。它会先查找 .bash_profile,然后是 .profile,然后是 .bashrc。如果找到 .bash_profile 或 .profile,它就不会再查找 .bashrc。
解决方案,请将以下内容放入您的 .profile 中:
[ -f $HOME/.bashrc ] && . $HOME/.bashrc