![防止在 PATH (.cshrc) 中重复输入](https://linux22.com/image/32558/%E9%98%B2%E6%AD%A2%E5%9C%A8%20PATH%20(.cshrc)%20%E4%B8%AD%E9%87%8D%E5%A4%8D%E8%BE%93%E5%85%A5.png)
我需要将目录添加到 .cshrc 文件中的路径变量中,并且我想确保与路径变量中的现有目录相比,这些条目不会重复。有人可以为此建议合适的命令吗?我的机器上的路径是:
分隔的,而不是空格分隔的。
答案1
如果在 Linux 上,我想你的csh
是tcsh
.那么你应该能够做到:
set -f path=("/new/entry" $path:q)
在csh
、tcsh
和 中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 如果测试