防止在 PATH (.cshrc) 中重复输入

防止在 PATH (.cshrc) 中重复输入

我需要将目录添加到 .cshrc 文件中的路径变量中,并且我想确保与路径变量中的现有目录相比,这些条目不会重复。有人可以为此建议合适的命令吗?我的机器上的路径是:分隔的,而不是空格分隔的。

答案1

如果在 Linux 上,我想你的cshtcsh.那么你应该能够做到:

set -f path=("/new/entry" $path:q)

cshtcsh和 中zsh$path特别大批变量与$PATH 标量环境变量,因为数组的元素是通过在冒号字符上$path拆分变量来构造的。对或$PATH的任何修改都会自动反映到另一个变量中。$path$PATH

-f上面是只保留第一个条目。 $path:q是 的元素$path,被引用,防止分词。因此,上面的语法会在前面添加/new/entry或将其移动到前面(如果它已经存在)。

你为什么要使用csh呢?


注意:上面的引号是必要的。或者更准确地说,/new/entry需要以某种方式引用所有字符。

set -f path=('/new/'\e"ntry" $path:q)

没问题。

set -f path=(/'new/entry' $path:q)

不是。不过,您始终可以分两个阶段进行:

set path=(/new/entry $path:q)
set -f path=($path:q)

(您可能想远离的原因之一csh

答案2

我只是将其添加为斯蒂芬答案的补充:如何摆脱 $PATH 中的重复项

我假设你有

  • 应保留在前面的目录
  • 以及其他目录,顺序并不重要(即放置在上述目录之后)

所以:

要取消重复条目:

UNIQUE_LIST=$( echo "$PATH" | tr ':' '\n' | sort | uniq)

# then we place in front those from UNIQUELIST that match an ordered list
# note that that way, those who didn't have "/sbin" still won't have it, but if they did
# it will be at the right place in the list
shouldbefirst="/bin /sbin /usr/bin" # complete or re-order as needed on your system...
for dir in $shouldbefirst
do
   if ( echo "$UNIQUE_LIST" | grep "$dir" >/dev/null 2>/dev/null)
   then #we have this dir in UNIQUE_LIST
      NEWLIST="${NEWLIST}:${dir}"
      UNIQUE_LIST="$( echo "$UNIQUE_LIST" | grep -v "^$dir\$")"  #we treated that one, take it out of the original list
   fi
done

# then put the remaining of UNIQUE_LIST in the order you want (here, alphabetically)
for dir in $UNIQUE_LIST
do 
   NEWLIST="${NEWLIST}:${dir}"
   UNIQUE_LIST="$( echo "$UNIQUE_LIST" | grep -v "^$dir\$")"  #we treated that one, take it out of the original list
done

 # get rid of possible first ":" (as NEWLIST starts empty)
 NEWLIST="$(echo "$NEWLIST" | sed -e 's/^://')"

 # and then : (I test by placing "echo" in front, get rid of "echo" if it looks fine)
 echo PATH="$NEWLIST"

(我现在无法测试)

注意:我补充建议:删除 PATH 中的“。”,因为它将被“提升”到 SHOULDBEFIRST 目录之后...(“。”应始终避免使用,如果使用,也应始终放在最后,这样您就无法轻松绕过 /bin、/usr/bin 等中的命令)

答案3

我相信下面的内容可以达到你想要的效果。

if ( $PATH =~ */some/path* ) then
    set PATH = ($PATH:/some/path)
endif

注意:我更多的是 bash 用户,所以如果我有一个小错误,请告诉我
csh 如果测试

相关内容