Записи дубликата чернослива от переменной ПУТИ

Сделал Вы изменяете свои настройки PuTTY; После того как Вы ввели свое имя сервера или IP-адрес, измените настройки SSH-> X11: Установите флажок "Enable X11 forwarding" и тип localhost:0 в "X местоположений дисплея". Не забывайте возвращаться к "Сессии" и сохранять Ваши изменения.

9
задан 19 October 2010 в 19:22
6 ответов

Используйте pathmunge () функция, доступная в большей части дистрибутива /etc/profile:

pathmunge () {
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
   if [ "$2" = "after" ] ; then
      PATH=$PATH:$1
   else
      PATH=$1:$PATH
   fi
fi
}

править: Для zsh пользователи, typeset -U <variable_name> дедуплицирует записи пути.

12
ответ дан 2 December 2019 в 22:24
  • 1
    Спасибо! Это не находится в /etc/profile на Debian Lenny, таким образом, я включаю его в мой .bashrc. использование –  Christopher Bottoms 19 October 2010 в 19:15
  • 2
    : pathmunge /some/path поместит /some/path в начале $PATH и pathmunge /some/path after поместит /some/path в конце $PATH –  Christopher Bottoms 19 October 2010 в 19:18
  • 3
    Более чистый способ сделать проверку, чтобы видеть, существует ли разрубить каталог в текущем пути в современных оболочках удара: if ! [[ $PATH =~ (^|:)$1($|:) ]] ; then. –  Christopher Cashell 28 October 2010 в 19:38

Установите свой путь явно.

1
ответ дан 2 December 2019 в 22:24
  • 1
    Спасибо. Я пытался установить путь явно, но у меня есть .bashrc файл, который я использую в нескольких средах, таким образом, точное значение по умолчанию PATH не всегда то же. –  Christopher Bottoms 19 October 2010 в 19:26

Только одна строка:

for i in $(echo $PATH|tr ":" "\n"|sort|uniq);do PATH_NEW="${PATH_NEW}$i:";done;PATH="${PATH_NEW%:}"
1
ответ дан 2 December 2019 в 22:24
  • 1
    Спасибо. Один трудно это вызвало бы меня, то, что это в алфавитном порядке (или ASCIIbetically) переупорядочивает содержание $PATH. Мне нравится помещать определенные каталоги в начале $PATH (как /home/username) так, чтобы мои персональные копии исполняемых файлов были выполнены вместо встроенных значений по умолчанию. –  Christopher Bottoms 19 October 2010 в 19:32

Я могу думать о двух различных способах, которыми Вы могли разрешить это. Первый, должен запустить Ваш .bashrc со строки, которая явно устанавливает Ваш основной ПУТЬ, тот путь каждый раз, когда Вы получаете его, это сбрасывается к основе до добавления дополнительных каталогов.

Например, добавьте:

# Reset the PATH to prevent duplication and to make sure that we include
# everything we want.
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Поочередно, можно проверить на объект перед добавлением его к пути. Чтобы сделать это, Вы использовали бы что-то как:

if ! [[ $PATH =~ '~/perl5/bin' ]]
then
    PATH="~/perl5/bin:$PATH"
fi

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

Примечание: Вторая опция может только работать, как записано в современном ударе версий. Поддержка регулярного выражения не является Оболочкой Bourne (/bin/sh) функция и не может существовать в других оболочках. Кроме того, использование кавычек не может быть необходимо или может даже вызвать проблемы на некоторых новейших версиях удара.

1
ответ дан 2 December 2019 в 22:24
  • 1
    Спасибо. Я пытался установить путь явно, но у меня есть .bashrc файл, который я использую в нескольких средах, таким образом, точное значение по умолчанию PATH не всегда то же. –  Christopher Bottoms 19 October 2010 в 19:20
  • 2
    Можно все еще обработать это путем регистрации в сценарии для наблюдения то, что локальное имя хоста, и затем устанавливание полного пути соответственно для того сервера. –  Christopher Cashell 19 October 2010 в 19:26

I was having this issue so I used a combination of techniques listed on StackOverflow question. The following is what I used to dedupe the actual PATH variable that had already been set, since I didn't want to modify the base script.

    tmppath=(${PATH// /@})
    array=(${tmppath//:/ })
    for i in "${array[@]//@/ }"
    do
        if ! [[ $PATH_NEW =~ "$i" ]]; then
            PATH_NEW="${PATH_NEW}$i:";
        fi
    done;
    PATH="${PATH_NEW%:}"
    export PATH
    unset PATH_NEW

You could always optimize this a bit more, but I had extra code in my original to display what was happening to ensure that it was correctly setting the variables. The other thing to note is that I perform the following

  1. replace any SPACE character with an @ character
  2. split the array
  3. loop through the array
  4. replace any @ characters in the element string with a space

This is to ensure that I can handle directories with spaces in (Samba home directories with Active Directory usernames can have spaces!)

3
ответ дан 2 December 2019 в 22:24

Вот мое решение: ПУТЬ = $ (echo -n $ PATH | awk -v RS =: -v ORS =: '! X [$ 0] ++' | sed "s / \ (. * \). \ {1 \} / \ 1 / ")

Хороший простой лайнер, не оставляющий следов:

0
ответ дан 2 December 2019 в 22:24

Теги

Похожие вопросы