Linux remove from path

Как удалить путь из системного пути (`$PATH`) с помощью команд терминала?

Я добавил путь к каталогу к системному пути ( $PATH запустив,

Теперь мой путь выглядит так,

я хочу удалить /home/avinash/Desktop/raj из переменной системного пути с помощью команды (как команда экспорта делает при добавлении пути).

6 ответов

Бег export PATH=$PATH:/. не устанавливает ваш PATH общесистемный. Это просто переменная оболочки. Запустите новую оболочку и BOOM, она исчезла. Очевидно, если вы добавили это в

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

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

В вашей текущей оболочке (вашей текущей сессии gnome-терминала) вы можете сделать это используя:

удаляет самое короткое совпадение $substring от задней части $string ,

Проверьте манипуляции со строками для получения дополнительной информации.

Один грязный хак

  1. разделите каждый каталог в вашем PATH по строке, используя tr
  2. удалите то, что вы не хотите (соответствие пути «raj»), используя grep -v , а также
  3. свернуть обратно в длинную строку «:» с помощью paste ,

это, вероятно, не будет работать хорошо, если какой-либо каталог в PATH имеет : или новая строка

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

Если вы положите export заявление в любом файле инициализации оболочки, как

/.bashrc , вы можете использовать следующие команды в терминале,

Это удалит папку из пути.

Если вы экспортировали путь из терминала

Папка будет в пути, пока вы находитесь в этой оболочке. Чтобы перезаписать путь, вы должны назначить новый путь. Как уже упоминалось в другом ответе.

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

Это замена подстроки,

Если вы хотите использовать его в качестве команды, вот небольшой скрипт:

Назови это unexport и добавьте его в свой путь.

unexport /usr/local/bin /bin /sbin

Этот скрипт не меняет ваш на самом деле PATH , Если вы хотите, чтобы скрипт делал это, вам следует изменить последнюю строку. Замена echo «export PATH=$PATH» в export PATH=$PATH

export PATH=$PATH:/home/avinash/Desktop/raj (Здесь вы добавили файл в переменную пути.)

echo $PATH
Если вы выполните эту команду, это будет вывод:

Как убрать его с пути? просто выполните

Это концепция замены строк.

Объявите -x PATH=»/ желаемый / путь /you_want», если я не ошибаюсь, он сам обновит то, что вы хотите, и это будет полностью по вашему желанию, каким оно будет. [Убедитесь, что вы запускаете как root И как желаемый пользователь, для которого вы хотите, чтобы это изменение повлияло] Чтобы быть уверенным, запустите ENV после этого, чтобы убедиться, что $PATH был эффективно изменен, как вы хотите. (Это можно использовать для изменения любого вывода, который вы получите при запуске ‘/usr/bin/env’. Хотя я не знаю, является ли он постоянным. В этом отношении сделайте, как указано выше, и измените

/.bashrc для это приклеить)

Встроенная команда оболочки export Не определяет, установлена ​​ли переменная или нет, она определяет, установлены ли переменная и ее значение в подпроцессах.

Изменение переменной, экспортированной или нет, не влияет на родительский процесс или выше, поэтому изменение его в сценарии не действует, если только этот сценарий не запущен с source ,

обрежет последний компонент переменной PATH. это export статус не влияет.

Источник

Каков самый элегантный способ удалить путь из переменной $PATH в Bash?

или в более общем плане, как удалить элемент из списка, разделенного двоеточием, в переменной среды Bash?

Я думал, что видел простой способ сделать это много лет назад, используя более продвинутые формы расширения переменной Bash, но если это так, я потерял его из виду. Быстрый поиск Google дал удивительно мало релевантных результатов, и ни один из них я бы не назвал «простым» или «элегантным». Например, два метода с использованием sed и awk, соответственно:

ничего не делает прямолинейное существование? Есть ли что-нибудь аналогичное функции split() в Bash?

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

Читайте также:  Ping �� mac ������ linux

есть некоторые очень умные методы здесь. В конце концов, я добавил следующие три функции в моем арсенале. Магия происходит в path_remove, который основан в основном на умном использовании Мартина Йорка awk переменная RS.

единственный реальный cruft там является использование sed чтобы удалить конечную двоеточие. Учитывая, насколько прямолинейна остальная часть решения Мартина, я вполне готов жить с этим!

вопрос: Как манипулировать элементами $PATH в сценариях оболочки?

30 ответов

Edit: это ответ на комментарии ниже:

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

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

мой грязный хак:

поскольку большая проблема с подстановкой-это конечные случаи, как насчет того, чтобы сделать конечные случаи не отличающимися от других случаев? Если путь уже имел двоеточия в начале и конце, мы могли бы просто искать нужную строку, обернутую двоеточиями. Как бы то ни было, мы можем легко добавить эти двоеточия и удалить их впоследствии.

вот самое простое решение я могу придумать:

в приведенном выше примере будет удален любой элемент в $PATH, содержащий «usr». Вы можете заменить «* usr* » на «/ home/user / bin», чтобы удалить только этот элемент.

обновление per sschuberth

хотя я думаю, что пробелы в $PATH — это ужасно идея, вот решение, которое обрабатывает это:

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

лично я также считаю, что это легко читать / понимать, и он включает только общие команды вместо использования awk.

выкопал его из моего .файл bashrc. Когда вы играете с PATH, и он теряется, awk/sed / grep становится недоступным 🙂

лучший вариант pure bash, который я нашел до сих пор, следующий:

вот это решение:

  • это чистый Баш,
  • не вызывает другие процессы (например, » sed » или «awk»),
  • не меняет IFS ,
  • не вилка суб-оболочки,
  • обрабатывает пути с пробелами, и

удаляет все вхождения аргумента в PATH .

Я только что использовал функции в распределении bash, которые были там, по-видимому, с 1991 года. Они все еще находятся в пакете bash-docs на Fedora и используются в /etc/profile , но не более.

Ну, в bash, поскольку он поддерживает регулярное выражение, я бы просто сделал:

Я написал ответ на это здесь (используя awk тоже). Но я не уверен, что это то, что вы ищете? По крайней мере, мне кажется ясным, что он делает, а не пытается вписаться в одну линию. Для простого лайнера, который удаляет только вещи, я рекомендую

или (короче, но менее читаемый)

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

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

Если вы обеспокоены удалением дубликаты в $PATH, самым элегантным способом, ИМХО, было бы не добавлять их в первую очередь. В 1 строку:

$папка может быть заменена чем угодно и может содержать пробелы («/home/user/my documents»)

самое элегантное чистое решение bash, которое я нашел на сегодняшний день:

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

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

мне нравятся три функции, показанные в обновлении @BenBlank к его исходному вопросу. Чтобы обобщить их, я использую форму 2-аргумента, которая позволяет мне установить PATH или любую другую переменную среды, которую я хочу:

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

каков самый элегантный способ удалить путь из переменной $PATH в Bash?

что более элегантно, чем awk?

питон! Это более читаемое и поддерживаемое решение, и его легко проверить, чтобы увидеть, что он действительно делает то, что вы хотите.

Допустим, вы хотите удалить первый элемент пути?

(вместо трубопроводов из echo , os.getenv[‘PATH’] было бы немного короче, и при условии того же результата, что и выше, но я беспокоюсь, что Python может что-то сделать с этой переменной среды, поэтому, вероятно, лучше передать ее непосредственно из среды, о которой вы заботитесь.)

аналогично удалить с конца:

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

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

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

общая проблема со сборками программного обеспечения заключается в том, что он ломается на некоторых машинах, в конечном счете из-за того, как кто-то настроил свою оболочку по умолчанию (Путь и другие переменные среды). Элегантное решение состоит в том, чтобы сделать ваши сценарии сборки иммунными, полностью указав среду оболочки. Кодируйте сценарии сборки, чтобы задать путь и другие переменные среды на основе элементов сборки, которыми вы управляете, таких как расположение компилятора, библиотеки, инструменты, компоненты и т. д. Сделайте каждый настраиваемый элемент чем-то, что вы можете индивидуально установить, проверить и затем использовать в своем скрипте.

например, у меня есть Maven на основе WebLogic-целевой Java-сборки, которую я унаследовал от своего нового работодателя. Сценарий сборки печально известен своей хрупкостью, и еще один новый сотрудник и я потратили три недели (не полный рабочий день, только здесь и там, но все еще много часов), чтобы заставить его работать на наших машинах. Важным шагом было то, что я взял под контроль путь, чтобы точно знать, какая Java, какая Maven и какая WebLogic вызывается. Я создал переменные среды, чтобы указать на каждый из этих инструментов, затем я рассчитал путь, основанный на них плюс несколько других. Подобные методы приручили другие настраиваемые настройки, пока мы, наконец, не создали воспроизводимую сборку.

кстати, не используйте Maven, Java в порядке, и покупайте только WebLogic, если вам абсолютно нужна его кластеризация (но в противном случае нет, и особенно не его собственные функции).

как и в случае с @litb, я дал ответ на вопрос»Как манипулировать элементами $PATH в сценариях оболочки», так что мой главный ответ там.

функциональность «Сплит» в bash и другие производные оболочки Борна наиболее аккуратно достигаются с $IFS «Интер» -разделитель полей. Например, чтобы задать позиционные аргументы ( , , . ) для элементов пути используйте:

он будет работать нормально, пока нет пробелов в $ПУТЬ. Заставить его работать для элементов пути, содержащих пробелы, — нетривиальное упражнение, оставленное для заинтересованного читателя. Вероятно, проще справиться с этим, используя язык сценариев, такой как Perl.

у меня тоже есть скрипт clnpath , который я широко использую для установки моего пути. Я задокументировал это в ответе на «Как избежать дублирования переменной пути в csh».

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

вот немного менее элегантная версия, которая удаляет один каталог из $PATH использование только строковых манипуляций. Я проверил его.

вот Perl One-liner:

на $a переменная получает путь для удаления. The s (заменить) и print команды неявно работают на $_ переменной.

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

с расширенной поддержкой подстановка можно сделать следующее:

расширенные подстановка один-лайнер (ну, вроде):

Кажется, нет необходимости избегать косых черт в $1.

добавление двоеточий в путь мы также можем сделать что-то вроде:

в path_remove_all (по proxxy):

хотя это очень старый поток, я думал, что это решение может представлять интерес:

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

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

выше приведен упрощенный пример конечных функций, которые я использую. Я также создал path_add_before и path_add_after позволяет вставить путь до / после указанного пути уже в PATH.

полный набор функций доступен в path_helpers.sh в моем dotfiles. Они полностью поддерживают удаление/добавление/добавление/вставка в начале/середине / конце строки пути.

трейлинг’: ‘вызван тем, что вы устанавливаете окончание строки, а не разделитель. Я использую ограниченные ресурсы и люблю упаковывать все в один скрипт, без этих странностей:

Это, конечно, элегантно, но он использует внешний sed. Кроме того, он удаляет все пути, содержащие строку поиска $1. Он также не оставляет болтаться: в конце в случае, если удаленный путь является последним на пути.

эта альтернатива оставляет болтающийся финал: однако.

Источник

How to remove a path from system path(`$PATH`) using terminal commands?

I added a directory path to system path( $PATH ) by running,

Now my path look like this,

I want to remove /home/avinash/Desktop/raj from system path variable by using command(like export command does on adding path).

9 Answers 9

In your current shell (your current session of gnome-terminal) you can do this using:

deletes shortest match of $substring from back of $string .

Check out String manipulation for more info.

Running export PATH=$PATH:/. doesn’t set your PATH system-wide. It’s just a shell variable. Start a new shell and BOOM, it’s gone. Obviously if you’ve added that to

/.bashrc (or another environment bootstrap file) you’ll have to revert that change but it doesn’t sound like your problem here.

If you’re desperate not to start a new shell, you could set it by removing it manually, with:

If you want use it as a command, here is a little script:

Name it unexport , and add it to your PATH.

unexport /usr/local/bin /bin /sbin

This script does not change your actually PATH . If you want script to do it, you should change last line. Substitute echo «export PATH=$PATH» to export PATH=$PATH

If you put the export statement in any shell initiation file like

/.bashrc , you can use the following commands in terminal,

It will remove the folder from path.

If you have exported the path from a terminal

The folder will be in path as long as you are in that shell. To overwrite the path you have to assign new path. As oli already mentioned in the other answer.

You can use the following command to set old path

This is Substring Replacement,

One dirty hack is

  1. separate each dir in your PATH by line using tr
  2. remove what you don’t want (path matching «raj») using grep -v , and
  3. collapse back into a long «:» delimited string using paste .

this probably wont work well if any dir in PATH has : or a new line

if you find yourself doing this a lot, consider making it a function and saving in your shell profile (e.g. .bashrc , .zshrc )

export PATH=$PATH:/home/avinash/Desktop/raj (Here you have added the file to the path variable.)

echo $PATH
If you execute this command, This is the output:

How do you remove it from the path? just execute

It is a concept of string replacement.

The shell builtin command export Doesn’t determine whether or not a variable is set, it determines if the variable and its value are also set in sub-processes.

Changing a variable, exported or not, does not affect the parent process or above, so changing it in a script has no effect unless that script is run with source .

A shell function:

will trim off the last component of the PATH variable. Its export status is unaffected.

declare -x PATH=»/desired/path/you_want» if I’m not mistaken that itself will update what you want and it’s completely at your behest what it will be. [Make sure you run as root AND as the desired user for which you want this change to affect] To be double sure, run ENV afterwards to make sure that the $PATH was effectively altered as you want. (This is usable for altering any of the output you will get when you run ‘/usr/bin/env’. Although I dont know whether or not it is permanent. In that respect do as stated above and alter

/.bashrc for it to stick)

I simply use sed, like this

this should do the trick.

A little explain how this will work: First we define the variable value setting PATH=, then we must say to use the result value of next command as the value of this variable just using $(command), after came the SED command sed «s///», the / will be the separators for this command, by default we use / but you can set anything like or _. The first s is for replace, then came the first separator, after came the expression you look for, then another separator, then the expression you want to replace the first one (that you look for), then another separator (the last one) and you can use some argument like g, for a global replace. The \ is a scape character that used for make sed understand that next / is a literal and not the separator. The

Not the answer you’re looking for? Browse other questions tagged command-line or ask your own question.

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.10.8.40416

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

Читайте также:  Что такое mac os tiger
Оцените статью