Debian12在.bashrc中添加环境变量后每次启动终端都必须"source ~/.bashrc"

我想用Hexo搭建个人博客站点,于是就下载了Node.js包和Hexo包,并且把Node的bin目录添加到了.bashrc中作为环境变量,以便能在终端中使用node命令和hexo命令:

export PATH=/usr/local/node/node-v18.16.1-linux-x64/bin:$PATH

然而,每次启动终端,如果直接使用node命令或者hexo命令,就会提示命令不存在。只有cd到root目录使用source ~/.bashrc以后,才能使用node命令和hexo命令:

$ source ~/.bashrc 

我Goolge了一下这个问题,并看了一下Stack Overflow上的一些回答。终端在启动时会先读取/etc/profile,然后读取.bash_profile.bash_login.profile中的其中一个(按顺序排列)。.bashrc在终端启动时不会被读取,需要在上述三个文件中source。我检查了一下我的home目录,发现只有.profile这个文件,并且.profile中也已经source.bashrc

if [ "$BASH" ]; then
    if [ -f ~/.bashrc ]; then
        . ~/.bashrc
    fi
fi

我尝试了Stack Overflow上提供的四个解决方案,但是都失败了:

方案一,创建.bash_profile文件,并在其中添加:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

失败。

方案二,创建.bash_profile文件,并在其中添加:

[ -f "$HOME/.bashrc" ] && ."$HOME/.bashrc"

失败。

方案三,创建.bash_profile文件并添加node的bin目录作为环境变量:

export PATH=/usr/local/node/bin:$PATH

失败。

方案四,在.profile文件中添加node的bin目录作为环境变量:

export PATH=/usr/local/node/bin:$PATH

失败。

跪求各位大佬指点我应该怎么解决这个问题,万分感谢!

注1:

系统环境:Debian 12。

桌面环境:Xfce 4.18。

注2:

我的.profile文件的内容是:

# ~/.profile: executed by Bourne-compatible login shells.

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n 2> /dev/null || true

注3:

我的.bashrc文件的内容是:

# ~/.bashrc: executed by bash(1) for non-login shells.

# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022

# You may uncomment the following lines if you want `ls' to be colorized:
# export LS_OPTIONS='--color=auto'
# eval "$(dircolors)"
# alias ls='ls $LS_OPTIONS'
# alias ll='ls $LS_OPTIONS -l'
# alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'
export PATH=/usr/local/node/node-v18.16.1-linux-x64/bin:$PATH

尝试在 .bashrc 中添加一些其它的变量,比如 export FOOO=bar,然后启动终端看看这个变量在不在,用来确定.bashrc 是否被正确执行。
如果是,那也许是 xfce 的终端对 PATH 这个变量有什么特殊的偏见?echo $PATH 的输出是什么?
如果方便的话,贴一下你的配置文件比较好。

感谢您的指点。我按您说的把export FOOO=bar添加到了.bashrc的最后一行,然后重启终端,输入FOOO后还是提示找不到命令。

echo $PATH的输出是:

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games/

另注:我已经按您说的贴上了我的配置文件。

  • .profile 是不是也没有被执行?
  • 您的终端模拟器的 shell 是否是 bash,而不是 dash 或 sh?
  • 直接运行 bash 命令能否正常的执行 .bashrc.profile

需要注意的是,对于 dash(Debian 的 sh 是 dash 的别名,它严格遵守 POSIX 规范),export 语句的等号右侧必须用双引号包裹。

感谢您的指点。

1.通过source ~/.bashrcsource ~/.profile可以执行.bashrc.profile

2.我使用echo $0命令查看了我使用的shell,确实是bash

在 KDE Plasma 中安装了 xfce4-terminal,检查发现它会在启动的时候运行 .bashrc 而不是 .profile

编辑:

测试了 export PATH="$HOME/.local/bin:$PATH" 也工作正常。

我刚刚接触Linux和Debian,对于您说的检查运行的是.bashrc还是.profile这一操作确实是不了解。我是手动输入source ~/.profile来检查.profile是否能运行。

如果xfce-terminal运行的是.bashrc那应该不会出现我提到的问题。因为只要我手动执行一次source ~/.bashrc,就可以使用node命令或hexo命令了。

只有登陆的交互 shell 才会去读取 .profile,所以如果关闭这个:

图片

就不会在启动 xfce4-terminal 的时候运行 .profile,这是正常行为。与问题无关,只是记录一下。

所以很奇怪为什么你会说无法运行 .bashrc,这不应该发生。

问题不在于 source ~/.bashrc 能不能运行(显然该命令没什么问题),而是你的 xfce4-terminal 启动后会不会运行 .bashrc

可以列出以下你的家目录文件吗?运行命令 cd ~ && ls -a

你可以修改 .bashrc 文件增加几行 echo 命令来输出字符串方便 debug。

根目录文件如下:

root@NoahLin:~# ls -A
.bash_history  .cache		   .ssh
.bashrc        .node_repl_history  .sudo_as_admin_successful
.bashrc.swp    .profile		   .viminfo

你是不是正在使用 root 账户登陆?

你这贴出来的代码里的路径和前边说的矛盾。

root 目录?你是 root 登录的吗?还是你想说「home 目录」?

您好,感谢您的回复。
1.我在编辑问题的时候不记得具体的路径了,所以就简单写了,我现在会更改。
2.我是使用了root账户登录。我想表达的就是home目录。刚刚接触Linux,表达的不准确还请您见谅。

非常不推荐使用 root 账户登录,很多 GUI 软件没有考虑过在 root 用户下运行。我也不知道 root 用户下 xfce4-terminal 到底怎么处理用户配置文件…

您好。我打开终端的时候是没有使用root用户的,是切换到home目录的时候才下意识使用了root账户。

noah@NoahLin:~$ node --version
bash: node: command not found

直接打开终端输入node命令就是上面的结果。

如果在不使用root账户的情况下source ~/.bashrc,似乎也无法正常使用node命令。

noah@NoahLin:~$ source ~/.bashrc
noah@NoahLin:~$ node --version
bash: node: command not found

您觉得是xfce-terminal的问题吗?换一个终端模拟器能解决吗?

所以你的桌面登陆用户到底是谁?你修改的是哪个 .bashrc ?我猜你修改的是 root 用户的 .bashrc

我桌面登陆的账户就是在安装Debian的时候设置的那个非root账户,也就是上面的NoahLin

您说的对,根本原因就是我修改的是root.bashrc而不是用户的.bashrc,现在已经解决了,感谢您的指点!

记得把 root 用户的配置改回去。

早在看到你的 .bashrc 和正常 Debian 用户的 .bashrc 默认配置不一样我就该想到这一点的…

谢谢您,我已经改回去了。