존재하지 않는 디렉토리를 참조하는 bash 변수 설정 해제

존재하지 않는 디렉토리를 참조하는 bash 변수 설정 해제

$PATH 및 $LD_LIBRARY_PATH에 관련 디렉터리를 추가하는 응용 프로그램에서 제공되는 파일이 있습니다.

이는 괜찮지만 $PATH 및 $LD_LIBRARY_PATH가 다소 과도하게 오염되는 결과를 낳습니다. 꽤 많은 경로가 추가되고 그 중 약 2/3는 존재하지 않기 때문입니다.

를 사용하여 디렉터리의 존재를 테스트할 수 있지만 [ ! -d $VARIABLE_TO_ADD_TO_PATH ]디렉터리가 존재하지 않는 경우 설정을 해제하는 것이 더 어려운 것 같습니다.

(10개의 변수 각각에 대해) 쓸 수 있습니다.

if [ ! -d $VAR ]
    unset VAR
fi

하지만 난 기능이 있는 걸 더 좋아해.

나는 시도했다:

_testPathAndUnset()
{
   while [ $# -ge 1 ]
   do
      dirToTest=${1/startPattern/\$startPattern}
      if [ ! -d $dirToTest ]
         unset $1
      fi
      shift
   done
}

_testPathAndUnset VAR1 VAR2 VAR3(not ) 과 같은 형식으로 값을 전달했지만 $VAR1 $VAR2 $VAR3이제는 확장되지 않는 문자열이 있습니다.

사용하면 eval이 문제가 해결될 수 있지만 다른 질문, 답변, 웹 사이트 등은 이것이 일반적으로 나쁜 생각임을 암시합니다.

10x3의 30줄보다 더 나은 방법으로 이 문제를 어떻게 해결할 수 있습니까?

if [ ! -d $VAR ]
    unset VAR
fi

답변1

다음은 함수입니다:

_testPathAndUnset() { for d in "$@"; do [ -d "${!d}" ] || unset "$d"; done; }

여기서는 사용 중입니다. 우선 다음과 같은 두 개의 디렉터리가 있습니다.

$ ls -d */
a1/  a2/

우리는 디렉토리로 평가될 수도 있고 그렇지 않을 수도 있는 네 가지 쉘 변수를 정의합니다:

$ one=a1; two=a2; three=a3; four=a4

이제 이 네 가지 변수에 대해 함수를 실행해 보세요.

$ _testPathAndUnset one two three four

그리고 두 개의 변수만 설정된 상태로 유지됩니다.

$ echo "one=$one two=$two three=$three four=$four"
one=a1 two=a2 three= four=

세부:

  • for d in "$@"

    이는 명령줄의 모든 인수를 반복합니다.

  • [ -d "${!d}" ] || unset "$d"

    여기서는 d변수의 이름을 나타냅니다. ${!d}라는 변수의 값을 나타냅니다 d. 이는 명명된 변수의 값 d이 디렉터리인지 테스트합니다. 그렇지 않은 경우 [테스트는 false로 평가되고 해당 unset "$d"절이 실행됩니다.

관련 정보