В чем преимущество pathmunge перед grep? - PullRequest
8 голосов
/ 16 февраля 2011

В настоящее время работает над Solaris 10 в оболочке bash.Глядя на скрипт, я заметил, что процедура pathmunge настроена так, чтобы избежать дублирования путей к папкам в PATH (кажется, у него также есть возможность добавить необходимую папку в начале или конце PATH).

Помимо способности добавлять / предварительно ожидать (простите, если это неправильный термин) к PATH, почему мы не можем просто сделать echo ${PATH} | grep <folder one wishes to add>?

Если мое единственное намерение - это иметь определенноепапка в ПУТИ (и не очень заботится о начале или конце), будет ли grep служить цели?

Ответы [ 2 ]

10 голосов
/ 16 февраля 2011

До 2012 года pathmunge использовал сам grep.(Ну, точнее, egrep.)

В Red Hat, CentOS и т. Д. 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
}

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

, поэтому, если мой путь /usr/local/sbin:/usr/local/bin, echo ${PATH} | grep /usr/local вернет true, даже если / usr / local не в моем пути.Таким образом, вы должны соответствовать разделителям.Но если вы выполните grep для :/usr/local:, вы также не сможете выполнить это, потому что вы никогда не найдете первый или последний элемент в пути, поскольку $ PATH не начинается и не заканчивается разделителем.Вот почему используется egrep.(^ | :) соответствует двоеточию или началу строки.($ | :) соответствует двоеточию или концу строки.

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

1 голос
/ 03 октября 2014

Я предлагаю эволюцию патрона, который я использую уже 2 года.

pathmunge() {
if [ -d "$1" ]; then
  realpath / 2>&1 >/dev/null && path=$(realpath "$1") || path="$1"
  # GNU bash, version 2.02.0(1)-release (sparc-sun-solaris2.6) ==> TOTAL incompatibility with [[ test ]]
  [ -z "$PATH" ] && export PATH="$path:/bin:/usr/bin"
  # SunOS 5.6 ==> (e)grep option "-q" not implemented !
  /bin/echo "$PATH" | /bin/egrep -s "(^|:)$path($|:)" >/dev/null || {
    [ "$2" == "after" ] && export PATH="$PATH:$path" || export PATH="$path:$PATH"
  }
fi
}

1) Проверяет валидность каталога при минимальных затратах на производительность

2) Он также использует realpath, и команда realpath также проверяется. реальный путь, прежде чем добавить его в $ PATH

3) egrep -q недоступен в SunOS 5.6 (да, он по-прежнему используется во многих компаниях)

...