
$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"
절이 실행됩니다.