/ / Aká je výhoda pathmunge over grep? - bash, duplikáty

Aká je výhoda prechodu na cestu cez grep? - bash, duplikáty

V súčasnosti pracuje na systéme Solaris 10 v bash shelle. Pri pohľade na skript som si všimol postup nastavenia pathmunge, aby sa zabránilo duplicite cesty priečinkov v PATH (zdá sa, že má aj funkciu pridať potrebnú zložku na začiatok alebo na konci PATH).

Okrem schopnosti pripojiť / predbehnúť (odpusť, ak je to nesprávny termín) na PATH, prečo nemôžeme jednoducho urobiť echo ${PATH} | grep <folder one wishes to add> ?

Ak môj jediný zámer je mať určitú zložku v PATH (a nie naozaj znepokojený začiatkom alebo koncom), bude grep slúžiť účelu?

odpovede:

9 pre odpoveď č. 1

pathmunge používa samotný grep. (Nuž, egrep, aby som bol presný.)

V programe Red Hat, CentOS atď. Pathmunge je definovaný v /etc/profile:

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

Ako môžete vidieť, je to o niečo sofistikovanejšie, ako to, čo navrhujete, ale nie veľa. Dôvodom, prečo by váš návrh nefungoval, je to, že bez oddeľovačov to urobí čiastkové zápasy.

tak ak je moja cesta /usr/local/sbin:/usr/local/bin, echo ${PATH} | grep /usr/local sa vráti pravda, aj keď / usr / local nie je v mojej ceste, takže musíte zodpovedať oddeľovačom. :/usr/local: budete tiež zlyhať, pretože ste sa nikdy nezhodliprvú alebo poslednú položku v ceste, pretože $ PATH nezačne ani neskončí oddeľovačom. Preto sa používa egrep. (^ | :) sa zhoduje s dvojbodkou alebo začiatkom riadku ($ | :) sa zhoduje s dvojbodkou alebo koncom riadku.


1 pre odpoveď č. 2

Navrhujem vývoj na cestu, ktorý používam už 2 roky.

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) Kontroluje platnosť adresára za minimálne výkonové náklady

2) Taktiež používa realpath a príkaz realpath je tiež testovaný. realixujte svoje cesty predtým, než ich pridáte do reťazca $ PATH

3) egrep -q nie je k dispozícii na SunOS 5.6 (áno, stále sa používa v mnohých firmách)