как добавить каталог в $ PATH, но только если его там еще нет - PullRequest
0 голосов
/ 29 сентября 2018

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

Одной из проблем является /sbin, отсутствующая в пути.Но это не всегда так, поэтому вместо того, чтобы без разбора добавить его в .profile, .bash_profile, .bashrc и т. Д., Например, так:

echo "export PATH=\"$PATH:/sbin\"" >> ~/.bashrc

.. и со временем, заканчивая несколькимиexport PATH s с :/sbin:/sbin:/sbin:/sbin:/sbin на конце ... ну, вы поняли.Как мне справиться с этим?

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Возможно, это не самое лучшее решение, но оно мне вполне подходит.Мне всегда нравилось использовать Python для моих повторяющихся задач, что для правильного выполнения в bash потребуется слишком много времени, и это определенно отвечает всем требованиям.

Идея состоит в том, чтобы проверить, присутствует ли /sbin в $PATH, ограниченный началом или концом строки или двоеточием.grep или даже расширенный тест ([[) может сделать это для вас довольно легко, но для общего решения, где интересующий путь может содержать управляющие символы регулярного выражения или вам придется экранировать части строки.В Python это намного проще, чем в bash: Можно ли надежно экранировать метасимволы регулярных выражений с помощью sed .Поэтому я использую скрипт, подобный этому (который фактически избегает почти всего анализа вручную):

inpath

#/usr/bin/env python
"""
Checks if the sole argument is in the PATH.

Returns 0 if yes, 1 if no. It is an error to pass in more
than one command-line argument.
"""
import sys
from is import get_exec_path
from os path import abspath, normcase

if len(sys.argv) != 2:
    raise ValueError('Exactly one command line argument must be provided')
path = [normcase(abspath(p)) for p in get_exec_path()]
sys.exit(sys.argv[1] not in path)

Это может быть реализовано на любом количестве языков прощечем в Баш;Просто я знаком с Python.Он должен работать с любой верной версией, вероятно, даже до версии 2.6.Он написан для работы в Unix или Windows, хотя я собираюсь догадаться, что он не очень полезен для последних.Используйте это так:

if inpath /sbin ; then
    echo "export PATH=\"$PATH:/sbin\"" >> ~/.bashrc
fi

Или

inpath /sbin && echo "export PATH=\"$PATH:/sbin\"" >> ~/.bashrc
0 голосов
/ 29 сентября 2018

Функция pathmunge уже определена в /etc/profile:

pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}
0 голосов
/ 29 сентября 2018

Вот один из способов:

echo '[[ ":$PATH:" == *:/sbin:* ]] || PATH="$PATH:/sbin"' >> ~/.bashrc

(Обратите внимание, что, кстати, вам не нужно export при обновлении того, что уже является переменной среды.)


Как это работает:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...