Удаление каталога из 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\" } 
  • Редактирование bash $ PATH
  • найти глобальный путь установки композитора как root
  • Как правильно добавить путь к PATH?
  • Я изменил свой PATH при установке git. Каков путь по умолчанию на Mac?
  • bash: / home / hadoopuser / hadoop / sbin: есть каталог
  • Перемещение с bash на zsh: сброс PATH
  • Конфигурация PATH не влияет
  • Launcher для программы Python, которая требует дополнительных библиотек
  • Каталог Metasploit не запускает исполняемые файлы без ./
  • (G) VIM использует другую $ PATH, чем моя система
  • Что такое «рабочий каталог», когда cron выполняет задание?
  • Interesting Posts

    Отключить звуковое устройство ATI HDMI – Fedora с PulseAudio

    Как установить статический IP-адрес для отключенного интерфейса?

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

    Почему работает «echo os.system (« / bin / bash »)?

    Как я могу постоянно устанавливать разрешения на rw на Raspbian?

    Показывать сообщения об отключении от последнего выключения

    Непечатная escape-последовательность: когда?

    Группы рабочих областей в XMonad

    Изменить путь по умолчанию для того, когда я подключу SSH к серверу CentOS?

    Ошибка малины Pi RT.

    Как восстановить grub при загрузке uefi после обновления Windows?

    Автозаполнение слов из буферного терминала

    разрешение umask – где он работает, где он не работает – ftp vs scp

    Подсчитайте количество вхождений значения столбца в TSV-файл с AWK

    Написание службы в C: Как передать и обработать аргументы для запуска службы?

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