До 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 используются встроенные в оболочку возможности сопоставления с образцом, что немного более эффективно.