$PATH 中的重复条目有问题吗?

$PATH 中的重复条目有问题吗?

我获取了一些朋友的 bashrc。所以我最终在$PATH变量中出现了重复的条目。我不确定这是否会导致命令需要很长时间才能启动。$PATHbash 内部是如何工作的?路径越多是否会减慢我的启动时间?

答案1

拥有更多条目$PATH不会直接减慢启动速度,但每次在 shell 会话中首次运行特定命令时(不是每次运行该命令,因为 bash 维护缓存)都会减慢启动速度。除非您有一个特别慢的文件系统(例如 NFS、Samba 或其他网络文件系统,或者在 Cygwin 上),否则这种速度减慢很少被察觉。

当您查看视觉效果时,重复的条目也有点烦人$PATH,您必须费力地浏览更多的内容。

避免添加重复条目很容易。

case ":$PATH:" in
  *":$new_entry:"*) :;; # already there
  *) PATH="$new_entry:$PATH";; # or PATH="$PATH:$new_entry"
esac

旁注:获取别人的 shell 脚本意味着执行他编写的代码。换句话说,您可以让您的朋友随时访问您的帐户。

旁注:.bashrc不是设置$PATH或任何其他环境变量的正确位置。环境变量应该设置在~/.profile.看应该使用哪些设置文件来使用 bash 设置环境变量?,.bashrc 和 .bash_profile 之间的区别

答案2

我见过人们使用awk以下方法清除 PATH 变量中的重复项:

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

您可以尝试将其添加到您自己的 bashrc 中,并确保在运行之前将其他文件获取到某个位置。

另一种选择是使用pathmerge公用事业。

至于您的速度问题,这不会以任何显着的方式影响 shell 的启动时间,但它可能会节省一些时间来完成命令的制表符,特别是当在路径中找不到该命令并且它会重复搜索相同的路径时寻找它的文件夹。

关于安全性的说明:你应该真的注意吉尔斯的警告关于这里的安全。通过获取另一个用户拥有的文件,您可以在每次启动 shell 时为这些用户提供免费通行证,以您的用户身份执行他们自己的代码。如果您不信任这些用户的密码,则不应获取他们的 shell 文件。

答案3

根据@Gilles 的回答,您可以将其包装在一个函数中以最大程度地减少输入:

function addToPATH {
  case ":$PATH:" in
    *":$1:"*) :;; # already there
    *) PATH="$1:$PATH";; # or PATH="$PATH:$1"
  esac
}

addToPATH /Applications/AIRSDK_Compiler/bin
addToPATH ~/.local/lib/npm/bin

答案4

PATH操作(操作任何冒号分隔的列表)很容易。我使用 Stephen Collyer 的 bash_path_funcs,早在 2000 年就在 Linux Journal 中进行了描述:

https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/376​​8 https://www.linuxjournal.com/article/3935

addpath仅当路径中最初不存在该条目时,该函数才会将其添加到路径中。delpath -n从路径中删除所有不存在的目录。

您可以pathfunc.tgz从以下位置获取该文件 https://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

相关内容