%EC%97%90%EC%84%9C%20%EC%A4%91%EB%B3%B5%20%ED%95%AD%EB%AA%A9%20%EB%B0%A9%EC%A7%80.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
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