PATH(.cshrc)에서 중복 항목 방지

PATH(.cshrc)에서 중복 항목 방지

.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

Stephen의 답변에 추가로 이것을 추가하고 있습니다. $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"

(지금은 테스트할 수 없습니다)

참고: 제안 사항을 추가하겠습니다. "."는 SHOULDBEFIRST 디렉터리 다음에 "상승"되므로 PATH에서 제거하십시오. ("."는 항상 피해야 하며 사용하는 경우 항상 마지막에 배치해야 합니다. /bin, /usr/bin 등의 명령을 쉽게 우회할 수 있는 방법은 없습니다.)

답변3

나는 다음이 당신이 원하는 효과를 얻을 수 있다고 믿습니다.

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

참고: 저는 bash를 더 많이 사용하므로 작은 실수가 있으면 알려주시기 바랍니다.
테스트하면 csh

관련 정보