Я определил один и тот же путь в переменной $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::`
Таким образом вам не нужно избегать косой черты для оператора-замены.