1

Со временем я добавил кучу вещей в мою PATH, и это выглядит довольно ужасно. Как я могу очистить это или как правильно "переформатировать" все это?

export PATH="$PATH:~/scripts"
export PATH="$PATH:~/Downloads/android-sdk-mac_x86/platform-tools/adb"
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export PATH="$PATH:~/Downloads/android-sdk-mac_x86/platform-tools:~/Downloads/android-sdk-mac_x86/tools:~/Downloads/android-sdk-mac_x86/platform-tools/adb"
export PATH="$PATH:~/bin"
export PATH="$PATH:~/bin/subl"
export PATH="$PATH:~/.rvm/gems/ruby-1.9.3-head/gems/git-media-0.1.1/bin"

export PATH=$PATH:$HOME/bin:/Users/me/Downloads/android-sdk-mac_86/tools
export PATH=$PATH:$HOME/bin:/Users/me/Downloads/android-sdk-mac_86/platform-tools
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:/.rvm/scripts/rvm:/.rvm/scripts/rvm:/~/Downloads/android-sdk-mac_x86/tools/android:/~/Downloads/android-ndk-r7/:/~/Downloads/android-sdk-mac_x86/platform-tools
export CC=gcc-4.2
export PATH=~/Downloads/android-ndk-r7:$PATH
ANDROID_HOME=~/Downloads/android-sdk-mac_x86
export PATH=${PATH}:$ANDROIDHOME/platform-tools

4 ответа4

3

В Bash вам нужно экспортировать переменную только один раз, а не при каждом назначении. Удалите экспорт из всех ваших назначений PATH, затем поместите export PATH на отдельной строке в конце. Если вы просто устанавливаете переменную один раз, как в случае с CC, тогда экспорт перед ней вполне подойдет. Вы также можете экспортировать их с помощью одной команды, например, с помощью export PATH CC ANDROID_HOME .

В дистрибутив Bash входит несколько удобных функций для добавления или добавления пути к переменной. Я думаю, что они находятся в файле contrib под названием "pathfuncs". Они могут сделать ваш rc файл намного более читабельным.

  • add_path добавит запись в конец переменной PATH
  • pre_path добавит запись в начало переменной PATH
  • del_path удалит запись из переменной PATH, где бы она ни находилась

Если вы укажете переменную в качестве второго аргумента, она будет использовать ее вместо PATH.

Для удобства вот они:

# is $1 missing from $2 (or PATH) ?
no_path() {
    eval "case :\$${2-PATH}: in *:$1:*) return 1;; *) return 0;; esac"
}
# if $1 exists and is not in path, append it
add_path () {
  [ -d ${1:-.} ] && no_path $* && eval ${2:-PATH}="\$${2:-PATH}:$1"
}
# if $1 exists and is not in path, prepend it
pre_path () {
  [ -d ${1:-.} ] && no_path $* && eval ${2:-PATH}="$1:\$${2:-PATH}"
}
# if $1 is in path, remove it
del_path () {
  no_path $* || eval ${2:-PATH}=`eval echo :'$'${2:-PATH}: |
    sed -e "s;:$1:;:;g" -e "s;^:;;" -e "s;:\$;;"`
}

Если вы добавите их в свой стартовый файл bash, вы можете добавить их в PATH следующим образом:

pre_path $HOME/bin
add_path /sbin
add_path /usr/sbin

Или укажите другую переменную:

pre_path $HOME/man MANPATH
pre_path $HOME/share/man MANPATH
add_path /usr/local/man MANPATH
add_path /usr/share/man MANPATH

Я использую этот метод в моих файлах rc, ставя сначала pre_paths, а затем add_paths. Это делает все мои изменения пути легко понятными с первого взгляда. Еще одним преимуществом является то, что строки достаточно короткие, чтобы при необходимости я мог добавить заключительный комментарий к строке.

А так как это функции, вы можете использовать их в интерактивном режиме из строки комментария , например, говоря add_path `pwd` чтобы добавить текущий каталог в путь.


Изменить: Исправление поставляемого файла RC с функциями выше, у меня есть это:

pre_path /opt/local/bin
pre_path /opt/local/sbin
pre_path ~/Downloads/android-ndk-r7

add_path ~/scripts
add_path ~/Downloads/android-sdk-mac_x86/platform-tools
add_path ~/Downloads/android-sdk-mac_x86/tools
add_path ~/Downloads/android-sdk-mac_x86/platform-tools/adb
add_path ~/bin
add_path ~/bin/subl
add_path ~/.rvm/gems/ruby-1.9.3-head/gems/git-media-0.1.1/bin
add_path $HOME/bin
add_path /Users/me/Downloads/android-sdk-mac_86/tools
add_path /Users/me/Downloads/android-sdk-mac_86/platform-tools
add_path /usr/local/bin
add_path /usr/bin
add_path /bin
add_path /usr/sbin
add_path /sbin
add_path /usr/X11/bin
add_path /.rvm/scripts/rvm
add_path /.rvm/scripts/rvm
add_path /~/Downloads/android-sdk-mac_x86/tools/android
add_path /~/Downloads/android-ndk-r7/
add_path /~/Downloads/android-sdk-mac_x86/platform-tools

ANDROID_HOME=~/Downloads/android-sdk-mac_x86
add_path $ANDROID_HOME/platform-tools

export PATH
export CC=gcc-4.2

У вас есть некоторая очистка, чтобы удалить дубликаты и упорядочить вещи.

1

Тебе это не нужно

export PATH="$PATH:~/Downloads/android-sdk-mac_x86/platform-tools/adb"

Поскольку ADB является исполняемым файлом.

В этом:

export PATH="$PATH:~/Downloads/android-sdk-mac_x86/platform-tools:~/Downloads/android-sdk-mac_x86/tools:~/Downloads/android-sdk-mac_x86/platform-tools/adb"

Вы можете избавиться от вещей после двоеточия (повторение вышеупомянутого adb).

В этом:

экспорт

PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:/.rvm/scripts/rvm:/.rvm/scripts/rvm:/~/Downloads/android-sdk-mac_x86/tools/android:/~/Downloads/android-ndk-r7/:/~/Downloads/android-sdk-mac_x86/platform-tools

Вы повторяете инструменты платформы (последняя запись) и Android (2-я последняя запись).

Попробуйте поместить каждое добавление PATH в одну строку, и все дупы выскочат на вас.

1

Вы можете поместить все модификации пути в одну строку, например:

export PATH="$PATH:~/scripts:~/bin:~/bin/subl"

и т.д., но это не сделает его более читабельным.

В строке 11, однако, вы более или менее делаете выше. По крайней мере, вы отменяете все изменения пути, сделанные в строке 1-10, поэтому вы можете просто удалить строку 1-10. Затем вы можете объединить последующие изменения $PATH в одну строку, но, как я уже сказал, это будет одна непонятная строка.

1

Просто быстрая мысль: я бы, наверное, написал что-то вроде этого:

function addpath() {
    [[ -d "$1" ]] || return 1

    print -rl ${(s.:.)PATH} | grep -q "$1"
    [[ $? != 0 ]] || return 1

    path+="$1"
}

Затем я поместил бы мои пути (разделенные символом новой строки) для каждой машины, на которой выполняется эта конфигурация zsh, в файл, например, .zsh/paths.d/host1 и применил эту функцию к каждой строке выбранного файла ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .