Linux: удаление избыточных путей из переменной $PATH

Я определил один и тот же путь в переменной $PATH 6 раз.

Я не выходил, чтобы проверить, работает ли он.

Как удалить дубликаты?

Переменная $PATH выглядит следующим образом:

echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin

Как я мог бы reset просто

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Ответ 1

Вы просто выполните:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

который будет для текущего сеанса, если вы хотите постоянно менять его на любые .bashrc, bash.bashrc,/etc/profile - все, что подходит вашей системе и пользователям.

Ответ 2

Если вы используете Bash, вы также можете сделать следующее, если, скажем, вы хотите удалить каталог /home/wrong/dir/ из своей переменной PATH:

PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`

Ответ 3

Если вам нужно удалить путь из переменной PATH до запуска script, добавьте это в начало script:

PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')

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

PATH=/home/user/bin:$PATH

Или вы можете повторно добавить его в конце списка с помощью:

PATH=$PATH:/home/user/bin

Ответ 4

Вот один код строки, который очищает PATH

  • Это не мешает порядку PATH, просто удаляет дубликаты
  • Лечит: и empth PATH изящно
  • Никаких специальных символов не используется, поэтому не требуется escape
  • Использует /bin/awk, поэтому он работает даже при нарушении PATH

    export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";}
    {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1;
    printf(((NR==1)?"":":")$0)}}')";
    

Ответ 5

Linux с нуля имеет эту функцию в /etc/profile

# Functions to help us manage paths.  Second argument is the name of the
# path variable to be modified (default: PATH)
pathremove () {
        local IFS=':'
        local NEWPATH
        local DIR
        local PATHVARIABLE=${2:-PATH}
        for DIR in ${!PATHVARIABLE} ; do
                if [ "$DIR" != "$1" ] ; then
                  NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
                fi
        done
        export $PATHVARIABLE="$NEWPATH"
}

Это предназначено для использования с этими функциями для добавления к пути, так что вы не делаете это с избыточностью:

pathprepend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}

pathappend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}

Простое использование - просто указать pathremove путь к каталогу для удаления - но имейте в виду, что он должен точно соответствовать:

$ pathremove /home/username/anaconda3/bin

Это приведет к удалению каждого экземпляра этого каталога из вашего пути.

Если вам нужен каталог на вашем пути, но без избыточности, вы можете просто использовать одну из других функций, например. - для вашего конкретного случая:

$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games

Но, если читаемость не вызывает беспокойства, на данный момент вам лучше делать:

$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Ответ 6

В bash вы просто можете ${var/find/replace}

PATH=${PATH/%:\/home\/wrong\/dir\//}

Или в этом случае (поскольку бит замены пуст) просто:

PATH=${PATH%:\/home\/wrong\/dir\/}

Я пришел сюда первым, но пошел дальше, потому что думал, что для этого будет расширение параметра. Легче, чем sed!.

Как заменить символ-заполнитель или слово в переменной значением из другой переменной в Bash?

Ответ 7

Как вы добавили эти повторяющиеся пути в свою переменную PATH? Вы должны были отредактировать один из ваших файлов .. (.tcshrc, или .bashrc и т.д., в зависимости от вашей конкретной системы/оболочки). Чтобы исправить это, нужно снова отредактировать файл и удалить повторяющиеся пути.

Если вы не редактировали какие-либо файлы, и вы должны были модифицировать PATH в интерактивном режиме. В этом случае изменения не будут "прилипать", т.е. Если вы откроете другую оболочку или выйдете из системы и войдете в систему, изменения исчезнут автоматически.

Заметьте, что есть и некоторые файлы конфигурации в системной системе, но вряд ли вы их изменили, поэтому, скорее всего, вы будете менять файлы в своем личном домашнем каталоге (если вы хотите, чтобы эти изменения были постоянными, как только вы установили на набор путей)

Ответ 8

Предполагая, что ваша оболочка Bash, вы можете установить путь с помощью

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

но, как сказал Левон в другом ответе, как только вы закончите оболочку, изменения исчезнут. Вероятно, вы хотите настроить свой PATH в ~/.bash_profile или ~/.bashrc.

Ответ 9

Нет стандартных инструментов для "редактирования" значения $PATH (т.е. "добавить папку только тогда, когда она еще не существует" или "удалить эту папку" ).

Чтобы проверить, каким будет путь при входе в следующий раз, используйте telnet localhost (или telnet 127.0.0.1). Затем он запросит ваше имя пользователя и пароль.

Это дает вам новую оболочку для входа (то есть совершенно новую, которая ничего не наследует от текущей среды).

Вы можете проверить значение $PATH там и отредактировать свои rc файлы до тех пор, пока они не будут корректными. Это также полезно, чтобы увидеть, можете ли вы снова войти в систему после внесения изменений в важный файл.

Ответ 10

Для простого шаблона copy-paste я использую этот фрагмент Perl:

PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::`

Таким образом вам не нужно избегать косой черты для оператора-замены.