Как правильно задать «динамический» PATH в bash? (для Android SDK)

Как правильно задать «динамический» PATH в bash? (для Android SDK)

У меня установлен Android SDK, и я хочу, чтобы двоичные файлы build-tools/android-VERSIONбыли доступны в PATH, поэтому я добавляю несколько строк:

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-*/sdkи .build-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

Связанный контент