2011-02-16 18 views
6

Actualmente trabajando en Solaris 10 en el shell bash. Mientras miraba un script, noté que el procedimiento de la ruta de acceso estaba configurado para evitar la duplicación de rutas de carpeta en el PATH (también parece tener la función para agregar la carpeta necesaria al principio o al final de PATH).¿Cuál es la ventaja de pathmunge over grep?

Además de la posibilidad de agregar/pre-pend (perdón si ese es el término equivocado) para el PATH, ¿por qué no podemos simplemente hacer un echo ${PATH} | grep <folder one wishes to add>?

Si mi única intención es tener una determinada carpeta en la RUTA (y no estoy realmente preocupado por el comienzo o el final), ¿serviría un grep para este propósito?

Respuesta

9

pathmunge usa grep. (Bueno, egrep, para ser precisos.)

En Red Hat, CentOS, etc pathmunge se define en /etc/profile:

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

Como se puede ver, es un poco más sofisticado que lo que se propone hacer , pero no mucho. El motivo por el que su propuesta no funcionaría es que sin los delimitadores se realizarán coincidencias parciales.

así que si mi ruta es /usr/local/sbin:/usr/local/bin, echo ${PATH} | grep /usr/local me devolverá verdadero, aunque/usr/local no esté en mi camino. Entonces necesitas hacer coincidir los delimitadores. Pero si grep para :/usr/local: también fallará, porque nunca coincidirá con el primer o último elemento en la ruta, ya que $ PATH no comienza ni termina con el delimitador. Es por eso que se usa egrep. (^ | :) coincide con un punto o el principio de la línea. ($ | :) coincide con dos puntos o el final de la línea.

+1

@Ori, esta respuesta está fechada. En CentOS 6, 'pathmunge' en'/etc/profile' no usa 'grep' o' egrep'. –

1

Propongo una evolución a pathmunge, que utilizo desde hace 2 años.

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) Se comprueba la validez del directorio, para el coste de un rendimiento mínimo

2) Se utiliza realpath también, y la realpath comando se prueba también. realpath sus caminos antes de añadir a $ PATH

3) egrep -q no está disponible en SunOS 5.6 (sí, todavía está en uso en muchas empresas)

Cuestiones relacionadas