Bash에서 "동적"PATH를 설정하는 올바른 방법은 무엇입니까? (안드로이드 SDK의 경우)

Bash에서 "동적"PATH를 설정하는 올바른 방법은 무엇입니까? (안드로이드 SDK의 경우)

Android SDK가 설치되어 있고 PATH에서 바이너리를 build-tools/android-VERSION사용할 수 있기를 원하므로 몇 줄을 추가합니다.

ANDROID_SDK=/Application/Binaries/adt-bundle-linux-x86_64-20140321/sdk/
ANDROID_PATH=$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$ANDROID_SDK/build-tools/android-4.4.2/

여기에 문제가 있습니다. 언제든지 SDK를 업데이트할 수 있으므로 build-tools/android-4.4.2/이에 따라 변경될 수도 있습니다. 그렇다면 파일을 다시 편집하고 android-version$PATH의 해당 부분을 업데이트해야 합니다.

그래서 프로필을 이렇게 바꿨습니다.

ANDROID_SDK=/Application/Binaries/adt-bundle-linux-x86_64-20140321/sdk/
ANDROID_PATH=$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
for x in $ANDROID_SDK/build-tools/android-*/; do
    export PATH=$PATH:$x
done

멍청해 보이는데 더 좋은 방법은 없을까요?

답변1

이상적인 방법은 이라는 소프트 링크 디렉터리를 생성 adt하고 SDK 변경 후 다시 생성하는 것입니다.

따라서 당신은 PATH동일하게 유지됩니다.

답변2

ls이 접근 방식에서는 두 차례에 걸쳐 시간에 따라 디렉터리에 대해서만 정렬된 의 출력 ( )이 첫 번째 줄을 선택하는 명령 -td으로 파이프됩니다 . 결과적으로 PATH 환경 변수를 수정하려면 둘 다의 최신 버전을 사용해야 합니다 head.adt-bundle-linux-x86_64-*/sdkbuild-tools/android-*/

ANDROID_SDK=$( ls -td /Application/Binaries/adt-bundle-linux-x86_64-*/sdk/ | head -n 1 )
if ! [ -z $ANDROID_SDK ] ; then
    ANDROID_PATH=$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
    ANDROID_BUILDTOOLS=$( ls -td $ANDROID_SDK/build-tools/android-*/ | head -n 1 )
    if ! [ -z $ANDROID_BUILDTOOLS ] ; then
        echo "Adding $ANDROID_BUILDTOOLS to PATH"
        export PATH=$PATH:$ANDROID_BUILDTOOLS
    else
        echo "Couldn't find build tools"
    fi
else
    echo "Couldn't find SDK"
fi

답변3

PATH="$PATH:$(printf '%s:' $ANDROID_SDK/build-tools/android-[0-9.]*/)"

작동해야합니다.

cd ~ ; mkdir dir1 dir2 dir3
( PATH=$(printf %s: $HOME/dir[12])
echo "$PATH" )

/home/mikeserv/dir1:/home/mikeserv/dir2:

Another method:

PATH="$PATH:$( set -- `printf '%s\n' "$ANDROID_SDK"*/android[0-9.]*/ |
    sort -rV` ; [ -d "$1" ] && echo "$1" )"

그것은 이점을 취한다sort's -Version위치 매개변수를 보장해야 하는 처리"$1"항상 Android SDK의 최신 버전으로 설정됩니다. 예를 들어:

정렬하지 않고:

% printf %s\\n ~/dir[0-9]*
/home/mikeserv/dir1
/home/mikeserv/dir2
/home/mikeserv/dir23
/home/mikeserv/dir3
/home/mikeserv/dir45

그것으로:

%  printf %s\\n ~/dir[0-9]* | sort -V
/home/mikeserv/dir1
/home/mikeserv/dir2
/home/mikeserv/dir3
/home/mikeserv/dir23
/home/mikeserv/dir45

그리고 반대:

% printf %s\\n ~/dir[0-9]* | sort -rV
/home/mikeserv/dir45
/home/mikeserv/dir23
/home/mikeserv/dir3
/home/mikeserv/dir2
/home/mikeserv/dir1

관련 정보