2017-04-06 4 views
1

나는 fish 2.2.0을 사용하고 있습니다. (예, 그것이 오래되었다는 것을 알고 있습니다. 그것에 대해 아무 것도 할 수 없습니다.) $ PATH에서 경로 (/usr/local/ferret-6.82/bin)를 설정 해제하고 싶습니다. 이렇게하려면 sed을 사용하면 다음과 같이 작동합니다.

> echo $PATH 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /usr/local/ferret-6.82/bin /opt/intel/bin 

> echo $PATH | sed -e 's:/usr/local/ferret-6.82/bin ::g' 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin 

위대한! 그러나 ...

> set -gx PATH (echo $PATH | sed -e 's:/usr/local/ferret-6.82/bin ::g') 
set: Warning: path component /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin may not be valid in PATH. 
set: No such file or directory 
> echo $PATH 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /usr/local/ferret-6.82/bin /opt/intel/bin 

물론 모든 디렉토리가 존재합니다. 수동으로 경로 설정하기 :

> set -gx PATH /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin 
> echo $PATH 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin 

무엇이 잘못 되었나요? sed으로 내 경로 설정이 실패하는 이유는 무엇입니까?

답변

3

$ PATH, $ CDPATH 및 $ MANPATH는 물고기에게 특별합니다. (2.2.0 이후로는 특정 변수 일 뿐이며 그 전에는 모든 변수에 적용됩니다.)

구성 요소 당 하나의 요소가있는 콜렉션은 내보낼 때 콜론으로 구분 된 일반적인 형식으로 변환됩니다 외부 프로그램에서 가져 오기.

if set -l ind (contains -i -- /usr/local/ferret-6.82/bin $PATH) 
    set -e PATH[$ind] 
end 

contains -i 0 출력 첫 번째 인수 목록에서 해당 요소를 제거합니다 set -e,에 있다는 인덱스를 반환합니다

은 당신이 여기에서하고 싶은 물고기 스크립트를 사용 중입니다. "-"는 option-separator이며, 그 후에 인수는 옵션으로 해석되지 않습니다. $PATH의 누락 된 따옴표에주의하십시오. 그러면 $ PATH의 각 구성 요소가 별도의 인수로 전달됩니다.

또는 물고기 분할은 줄 바꿈에 대체를 명령하기 때문에, 당신은

printf '%s\n' $PATH | sed '\_/usr/local/ferret-6.82/bin_d' 

(참고로, 라인 당 $ 경로에서 작동 할 수 있습니다은 "D"명령의 경우는 구분 기호를 탈출하는 것이 필요하다 - 이 경우 "_"가 아닌 경우 처음 사용시 "/")