Удаление каталога из PATH

Я пытаюсь скомпилировать wxWidgets с помощью MingW, и у меня есть cygwin на моем пути, который, кажется, конфликтует. Поэтому я хотел бы удалить /d/Programme/cygwin/bin из переменной PATH, и мне интересно, есть ли какой-то элегантный способ сделать это.

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

6 Solutions collect form web for “Удаление каталога из PATH”

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

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

это будет для текущего сеанса, если вы хотите постоянно менять его на любые .bashrc, bash.bashrc, / etc / profile – независимо от потребностей вашей системы и пользователя. Однако, если вы используете BASH, вы также можете сделать следующее, если, скажем, вы хотите удалить каталог /home/wrong/dir/ из вашей переменной PATH, предположив, что это в конце:

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

Поэтому в вашем случае вы можете использовать

 PATH=$(echo "$PATH" | sed -e 's/:\/d\/Programme\/cygwin\/bin$//') 

В bash:

 directory_to_remove=/d/Programme/cygwin/bin PATH=:$PATH: PATH=${PATH//:$directory_to_remove:/:} PATH=${PATH#:}; PATH=${PATH%:} 

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

 PATH=:$PATH: PATH=${PATH//:\/d\/Programme\/cygwin\/bin:/:} PATH=${PATH#:}; PATH=${PATH%:} 

Первая и третья строки заключаются в том, чтобы каждый компонент пути поиска был окружен : чтобы избежать особого корпуса первого и последнего компонентов. Вторая строка удаляет указанный компонент.

Рассмотрев другие варианты, представленные здесь, и не полностью понимая, как некоторые из них работают, я разработал свою собственную функцию path_remove , которую я добавил в свой .bashrc :

 function path_remove { # Delete path by parts so we can never accidentally remove sub paths PATH=${PATH//":$1:"/":"} # delete any instances in the middle PATH=${PATH/#"$1:"/} # delete any instance at the beginning PATH=${PATH/%":$1"/} # delete any instance in the at the end } 

Это оказалось довольно близким к решению Gilles, но было завершено как функция bash, которую можно было легко использовать в командной строке.

Он имеет такие преимущества, что в качестве функции bash он работает как программа, не требуя быть программой на пути, и для ее выполнения не требуется никаких внешних программ, просто манипулирование строкой bash.

Он выглядит довольно надежным, в частности, он не превращает somepath:mypath/mysubpath в somepath/mysubpath : если вы запустите path_remove mypath , это была проблема с моей предыдущей функцией path_remove .

Отличное объяснение того, как работают манипуляции с строкой bash, можно найти в руководстве Advanced Bash-Scripting Guide .

Итак, объединив ответы от @gilles и @ bruno-a (и еще пару других трюков), я придумал этот однострочный, который удалит (каждый) REMOVE_PART из PATH, независимо от того, происходит ли это в начале, средний или конец PATH

 PATH=$(REMOVE_PART="/d/Programme/cygwin/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"') 

Это немного громоздко, но приятно иметь возможность сделать это одним ударом. ; используется для объединения двух отдельных команд sed:

  • s@:$REMOVE_PART:@:@g (который заменяет :$REMOVE_PART: с одним :$REMOVE_PART:
  • s@^:\(.*\):\$@\1@ (который удаляет начальные и конечные двоеточия, которые мы добавили с помощью команды echo)

И по аналогии, мне просто удалось придумать этот однострочный слой для добавления ADD_PART к PATH, только если PATH еще не содержит его

 PATH=$(ADD_PART="/d/Programme/cygwin/bin" sh -c 'if echo ":$PATH:" | grep -q ":$ADD_PART:"; then echo "$PATH"; else echo "$ADD_PART:$PATH"; fi') 

Измените последнюю часть для echo "$PATH:$ADD_PART" если вы хотите добавить ADD_PART в конец PATH вместо начала.

… или сделать это еще проще, создайте скрипт с именем remove_path_part с содержимым

 echo ":$PATH:" | sed "s@:$1:@:@g;s@^:\(.*\):\$@\1@" 

и скрипт под названием prepend_path_part с содержимым

 if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$1:$PATH"; fi 

и скрипт под названием append_path_part с содержимым

 if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$PATH:$1"; fi 

сделайте их исполняемыми, а затем назовите их так:

  • PATH=$(remove_path_part /d/Programme/cygwin/bin)
  • PATH=$(prepend_path_part /d/Programme/cygwin/bin)
  • PATH=$(append_path_part /d/Programme/cygwin/bin)

Аккуратно, даже если я сам так говорю 🙂

Чтобы завершить / улучшить принятый ответ от Тушара, вы можете:

  • избегайте избегать косой черты в PATH с помощью разделителей без косой черты
  • опустите параметр -e на странице sed man : «Если параметр no -e, –expression, -f или -file задан, тогда первый аргумент без аргумента берется как интерпретатор sed для интерпретации. "
  • используйте флаг g (глобальный) для удаления всех вхождений

В конце концов, это дает что-то вроде этого:

 PATH=$(echo "$PATH" | sed 's@:/home/wrong/dir$@@g') 

Это интересное упражнение, чтобы написать функцию bash для удаления каталога из переменной пути.

Вот некоторые функции, которые я использую в своих .bash * файлах для добавления / добавления каталогов к путям. Они обладают способностью удалять повторяющиеся записи, если они есть, и работать с любой разновидностью пути, разделенной двоеточием (PATH, MANPATH, INFOPATH, …). функция remove_from удаляет каталог.

 # {app,pre}pend_to path-var-name dirpath # remove_from path-var-name dirpath # # Functions to manipulate a path-style variable. {app,pre}pend_to # both remove any other instances of dirname before adding it to # the start or end of the path-var-name variable. # # Calling example: # append_to PATH "/usr/local/bin" # # Uses eval to allow target path varname to be passed in. function remove_from() { # add surrounging colons eval tmp_path=":\$${1}:" # if dir is already there, remove it (echo "${tmp_path}" | grep --silent ":${2}:") && tmp_path=`echo "$tmp_path" | sed "s=:${2}:=:=g"` # remove surrounding colons tmp_path=`echo "$tmp_path" | sed 's=^:==; s=:$=='` eval export $1=\"$tmp_path\" } function append_to() { remove_from "$1" "$2" # clean the path contents eval export $1=\"\$${1}:$2\" } function prepend_to() { remove_from "$1" "$2" # clean the path contents eval export $1=\"${2}:\$$1\" } 
  • Почему приложения Mono запускаются только из своего собственного каталога?
  • $ PATH на Fish Shell OS X
  • Переменная PATH для anaconda в Fedora
  • Найти путь DVD-ROM во FreeBSD
  • ключевое слово сервиса «сервис» не требуется
  • Как правильно добавить путь к PATH?
  • Как я могу временно заменить одну команду на другую?
  • Как я могу принудительно использовать конкретный двоичный файл при запуске скрипта
  • Как установить переменную среды JAVA_HOME, которая будет сохранена при выходе?
  • Debian Wheezy 7.1 - невозможно запустить Skype или Firefox
  • Запуск удаленного скрипта с помощью команды ssh
  • Interesting Posts

    Как автоматически войти в систему с пользователем root в Fedora?

    печатать строки между началом и концом, используя sed

    Esker ActiveX Plug-in для Firefox под Linux?

    Наследуются ли наследуемые переменные среды как переменные среды или переменные оболочки?

    Мой компьютер не может просматривать подключение только к определенной точке беспроводной связи, но другие работают

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

    Перенаправить ввод из файла в программу

    Как сделать sda1 больше / использовать файлы загрузки по умолчанию в sdb1

    Debian: обновления пакетов в стабильном дистрибутиве

    Возможно ли настроить VPN таким образом, чтобы я отключился от Интернета, если он снизился?

    Использование файла для установки пакетов с помощью apt-get

    Кросс-компилировать библиотеку libzdb для архитектуры ARM9

    Как выполнить итерацию через список, разделенный запятыми, и выполнить команду для каждой записи

    Почему видео разрывает такую ​​проблему в Linux?

    Ubuntu 14.04 LTS не сохраняет мои настройки

    Linux и Unix - лучшая ОС в мире.