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

bal*_*lki 62 bash path

我的一些朋友的 bashrc 来源。所以我最终在 $PATH 变量中有重复的条目。我不确定这是否是命令需要很长时间才能启动的问题。$PATH 在 bash 内部如何工作?有更多的 PATHS 会减慢我的启动时间吗?

Gil*_*il' 58

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

当您查看您的$PATH视觉时,重复条目也有点烦人,您必须通过更多的杂物。

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

case ":$PATH:" in
  *":$new_entry:"*) :;; # already there
  *) PATH="$new_entry:$PATH";; # or PATH="$PATH:$new_entry"
esac
Run Code Online (Sandbox Code Playgroud)

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

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

  • +1:不能强调“让您的朋友访问您的帐户”足够强调。即使没有试图伤害您,他们的脚本也可能正是他们所需要的,并且在您获取它时仍会吃掉您的午餐。 (9认同)

Cal*_*leb 38

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

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

您可以尝试将其添加到您自己的 bashrc 中,并确保在运行该文件之前在某处找到其他文件的来源。

另一种方法是使用pathmerge实用程序。

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

关于安全性的说明:您应该真正注意Gilles关于安全性的警告。通过获取另一个用户拥有的文件,您可以在每次启动 shell 时免费让这些用户以您的用户身份执行他们自己的代码。如果您不信任那些使用您的密码的用户,您就不应该获取他们的 shell 文件。

  • 我喜欢 awk one-liner,但它打印尾随 ORS ':'。所以我将其修改为 `PATH=$(echo "$PATH" | awk -v RS=':' -v ORS=":" '!a[$1]++{if (NR > 1) printf ORS; printf $a[$1]}')` (7认同)

小智 19

根据@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
Run Code Online (Sandbox Code Playgroud)