Я пытаюсь скомпилировать wxWidgets, используя MingW, и на моем пути есть cygwin, который, кажется, конфликтует. Поэтому я хотел бы удалить /d/Programme/cygwin/bin
из переменной PATH, и мне интересно, есть ли какой-нибудь элегантный способ сделать это.
Наивным подходом было бы отразить его в файл, удалить его вручную и получить его, но я держу пари, что есть лучший подход к этому.
bash
shell
environment-variables
path
Devolus
источник
источник
Ответы:
Нет стандартных инструментов для «редактирования» значения $ PATH (т. Е. «Добавлять папку только тогда, когда она еще не существует» или «удалять эту папку»). Вы просто выполняете:
это было бы для текущего сеанса, если вы хотите навсегда изменить его, добавьте его в любой .bashrc, bash.bashrc, / etc / profile - все, что соответствует вашей системе и потребностям пользователя. Однако если вы используете BASH, вы также можете сделать следующее, если, скажем, вы хотите удалить каталог
/home/wrong/dir/
из переменной PATH, предполагая, что он в конце:Так что в вашем случае вы можете использовать
источник
/
на что-то вроде|
:PATH=$(echo "$PATH" | sed -e 's|:/d/Programme/cygwin/bin$||')
чтобы предотвратить все побеги.В Баш:
Если вы не используете промежуточную переменную, вам нужно защитить
/
символы в каталоге, чтобы удалить их, чтобы они не рассматривались как конец текста поиска.Первая и третья строка предназначены для размещения каждого компонента пути поиска
:
, чтобы избежать специального размещения первого и последнего компонента. Вторая строка удаляет указанный компонент.источник
После рассмотрения других вариантов, представленных здесь, и неполного понимания того, как некоторые из них работают, я разработал свою собственную
path_remove
функцию, которую я добавил к своей.bashrc
:Это оказалось довольно близко к решению Жиля, но обернуто как функция bash, которую можно легко использовать в командной строке.
У него есть то преимущество, что, как функция bash, она работает как программа без необходимости быть программой на пути и не требует запуска каких-либо внешних программ, только манипулирование строкой bash.
Он выглядит довольно надежным, в частности, он не превращается
somepath:mypath/mysubpath
вsomepath/mysubpath
: если вы запускаетеpath_remove mypath
, это была проблема, с которой я столкнулся в своей предыдущейpath_remove
функции.Отличное объяснение того, как работает bash-строка, можно найти в Расширенном руководстве по Bash-Scripting .
источник
Итак, комбинируя ответы от @gilles и @ bruno-a (и нескольких других уловок sed), я придумал эту однострочную строку, которая удалит (каждый) REMOVE_PART из PATH, независимо от того, происходит ли это в начале, середина или конец пути
Это немного громоздко, но приятно иметь возможность сделать это одним ударом.
;
Используется для соединения вместе двух отдельных SED команды:s@:$REMOVE_PART:@:@g
(который заменяет:$REMOVE_PART:
один:
)s@^:\(.*\):\$@\1@
(который удаляет начальные и конечные двоеточия, которые мы добавили с помощью команды echo)И аналогичным образом, мне только что удалось придумать эту строку для добавления ADD_PART в PATH, только если PATH еще не содержит его
Измените последнюю часть на,
echo "$PATH:$ADD_PART"
если вы хотите добавить ADD_PART в конец PATH вместо начала....
... или чтобы сделать это еще проще, создайте скрипт
remove_path_part
с содержимыми скрипт вызывается
prepend_path_part
с содержимыми скрипт вызывается
append_path_part
с содержимымсделайте их все исполняемыми, а затем назовите их так:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Аккуратно, даже если я сам так скажу :-)
источник
Намного проще один вкладыш.
источник
Это интересное упражнение - написать функцию bash для удаления каталога из переменной пути.
Вот некоторые функции, которые я использую в своих файлах .bash * для добавления / добавления каталогов к путям. Они обладают способностью удалять повторяющиеся записи, если таковые имеются, и работают с любыми переменными пути, разделенными двоеточиями (PATH, MANPATH, INFOPATH, ...). функция remove_from удаляет каталог.
источник
Ниже приведен пересмотренный код решения Грега Тарса. Здесь используются только встроенные команды bash. Таким образом, это сэкономит много системных вызовов fork ().
источник
Чтобы завершить / улучшить принятый ответ от Tushar, вы можете:
-e
опцию, как указано на странице man sed : «Если не задана опция -e, --expression, -f или --file, то первый интерпретируемый аргумент не является опциональным для интерпретации сценария sed».g
(глобальный) флаг, чтобы удалить все вхожденияВ конце концов, это дает что-то вроде этого:
источник
Текущие ответы не решают мою похожую проблему в том, что мне нужно удалить несколько путей. Все эти пути являются подкаталогами одного каталога. В этом случае эта однострочная работа работает для меня: (предположим, что шаблон
cygwin
, т.е. удаляет все пути, которые содержатcygwin
)источник