在sudo

在sudo

当我输入 时echo $PATH,我得到输出:

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

但是,我使用;修改了我的PATH变量gksudo gedit /etc/environment文件现在读取为PATH="/opt/texbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games".

我不确定为什么我会得到两个不同的值PATH。我该如何修复它?

我正在 Chromebook 上使用 Crouton 运行 Xfce。

答案1

编辑

  • /etc/profile影响所有用户。
  • ~/.bash_profile影响单个用户的 bash shell(所以不是这个,因为它是针对 bash 特定的东西)。
  • ~/.profile影响单个用户、所有 shell。

注意:如果您同时拥有 和.profile.bash_profile并且您希望 bash 读取两者,那么您必须将. .profile, .bash_profileas添加.profile到默认情况下不读取,如果.bash_profile exists

sudo

  • 不要以 root 身份运行你的编辑器,所以不要这样做gksudo gedit «filename»
  • 避免以 root 身份运行 X11 应用程序,所以不要这样做gksudo gedit «filename»
  • 相反,做EDITOR=gedit sudoedit «filename».它将像处理临时文件一样运行编辑器,完成后它将以 root 身份复制填充内容。

答案2

正确的设置位置PATH~/.bash_profile

PATH="$PATH:/some/extra/paths:/may/go/here"

PATH变量应该已经导出,因此您不需要export再次导出它(再次导出它不会产生进一步的影响)。

的默认路径bash被硬编码到bash可执行文件中,然后在/etc/profile和 (在某些系统上)中进一步(可能)修改/etc/bash.bashrc

我的猜测是,中设置的路径/etc/environment主要由非shell使用,例如cronetc。

也可以看看:

答案3

/etc/environment是系统范围的后备。每个用户的配置~/.bash_profile可能会覆盖它。无论如何,不​​要乱搞/etc/environment配置 bash,而是将PATH你想要的任何内容放入~/.bash_profile.即使/etc/environment是错误的,它也会被你输入的内容覆盖~/.bash_profile

您可能还应该恢复/etc/environment到之前的状态,以避免依赖它的程序出现轻微损坏。该文件随程序包一起提供,因此您可以使用程序包管理器将其重置为原始形式。

答案4

更新说明:我为 zsh 编写了这个,但它也适用于 bash。

这是我用来保持道路清洁的一个技巧。 (注意:我将 zsh 配置作为单独的文件加载。此文件需要首先加载,因此在保持标准化命名约定的同时强制执行此操作的一个简单方法是使用前缀。前缀 with0_pathfix.zsh将导致该文件在其他 Zsh 配置文件之前运行。)

# add to path if $1 is not already in path
pathAppend() {

  if ! echo $PATH | egrep -q "(^|:)$1($|:)" ; then
    PATH=$PATH:$1
  fi
}

# filters the path checking against itself for duplicates returns clean path then exports the clean path. 

PATH=$(echo "$PATH" | awk -v RS=':' -v ORS=":" '!a[$1]++{if (NR > 1) printf ORS; printf $a[$1]}'); export PATH;

# This ensures that even if you manually added to the path the next time zsh source is reloaded the path will clean itself.

相关内容