В чем преимущество pathmunge перед grep?

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

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

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

2 ответов


pathmunge использует сам grep. (Ну, цапля, если быть точным.)

в красной шляпе, CentOS и т. д. pathmunge определяется в /etc/profile:

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

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

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


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

pathmunge() {
if [ -d "" ]; then
  realpath / 2>&1 >/dev/null && path=$(realpath "") || path=""
  # 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 || {
    [ "" == "after" ] && export PATH="$PATH:$path" || export PATH="$path:$PATH"
  }
fi
}

1) он проверяет правильность каталога, минимальную стоимость производительности

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

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