2011-02-16 3 views
6

현재 Solaris 10의 bash 쉘에서 작업하고 있습니다. 스크립트를 보면서 PATH에서 폴더 경로가 중복되지 않도록 pathmunge 절차가 설정되어 있음을 알았습니다 (PATH의 시작이나 끝에 필요한 폴더를 추가하는 기능도있는 것 같습니다).grep에서 pathmunge의 장점은 무엇입니까?

PATH에 추가/선고 (잘못된 용어 인 경우 용서) 외에 별도로 echo ${PATH} | grep <folder one wishes to add>을 사용할 수없는 이유는 무엇입니까?

내 유일한 의도는 PATH에 특정 폴더가 있고 (실제로는 시작이나 끝이 염려되지 않음) grep이 목적을 수행합니까?

답변

9

pathmunge는 grep 자체를 사용합니다. (음, egrep을가 정확합니다.) 등 레드햇, CentOS는,에서

pathmunge가 /etc/profile에 정의되어

당신이 볼 수 있듯이
pathmunge() { 
     if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then 
      if [ "$2" = "after" ] ; then 
       PATH=$PATH:$1 
      else 
       PATH=$1:$PATH 
      fi 
     fi 
} 

, 그것은 약간 더 정교한 당신이해야 할 제안 것보다입니다 ,하지만별로. 제안서가 작동하지 않는 이유는 구분 기호가 없으면 부분 일치를 생성하기 때문입니다.

내 경로가 /usr/local/sbin:/usr/local/bin 인 경우/usr/local이 내 경로에 있지 않더라도 echo ${PATH} | grep /usr/local은 true를 반환합니다. 따라서 구획 문자를 일치시켜야합니다. 그러나 :/usr/local:을 grep하면 $ PATH가 구분 기호로 시작하거나 끝나지 않으므로 경로의 첫 번째 항목이나 마지막 항목과 일치하지 않으므로 실패하게됩니다. 이것이 egrep이 사용되는 이유입니다. (^ | :)은 콜론이나 줄의 시작 부분과 일치합니다. ($ | :)는 콜론이나 줄 끝과 일치합니다.

+1

@Ori를 SunOS의 5.6에 사용할 수없는,이 대답은 지금 일자. CentOS 6에서'/ etc/profile'의'pathmunge'는'grep' 또는'egrep'을 사용하지 않습니다. –

1

저는 2 년 동안 사용하는 경로 진화에 대한 진화를 제안합니다. 최소한의 성능

2 비용

pathmunge() { 
if [ -d "$1" ]; then 
    realpath/2>&1 >/dev/null && path=$(realpath "$1") || path="$1" 
    # GNU bash, version 2.02.0(1)-release (sparc-sun-solaris2.6) ==> TOTAL incompatibility with [[ test ]] 
    [ -z "$PATH" ] && export PATH="$path:/bin:/usr/bin" 
    # SunOS 5.6 ==> (e)grep option "-q" not implemented ! 
    /bin/echo "$PATH" | /bin/egrep -s "(^|:)$path($|:)" >/dev/null || { 
    [ "$2" == "after" ] && export PATH="$PATH:$path" || export PATH="$path:$PATH" 
    } 
fi 
} 

1) 그것뿐만 realpath 사용), 디렉토리의 유효성을 검사하고, 명령 realpath도 시험한다. $ PATH에

3) egrep을 -q에 추가하기 전에 당신의 경로를 realpath하면 (예는 많은 기업에서 아직 사용)

관련 문제