¿Hay alguna manera de agregar un directorio a mi RUTA en zsh solo si aún no está presente?


15

¿Hay una manera fácil en zsh de agregar un directorio a mi RUTA solo si aún no está presente? (o, más generalmente, cualquier variable de entorno). He intentado:

PATH+=/my/directory

... pero si se ejecuta dos veces, se agrega dos veces.


2
@uther, eso no es un duplicado ya que esa otra pregunta era para bash, mientras que esta es para zsh, que tiene su propia forma de abordar este problema.
— Stéphane Chazelas

Respuestas:


32

In zsh $PATHestá vinculado (ver typeset -T) a la $pathmatriz. Puede forzar que esa matriz tenga valores únicos con:

typeset -U path

Y luego, agregue la ruta con:

path+=(~/foo)

Sin tener que preocuparse si ya estaba allí.

Para agregarlo al frente, haga:

path=(~/foo "$path[@]")

o:

path[1,0]=~/foo

si ~/fooya estaba en $patheso lo moverá al frente.


No quiere decir typeset -Ug path? Cuando lo uso typeset -U pathen mi ~/.zshrcarchivo, siempre recibo un error acerca de que no hay nada en el camino mientras se ejecuta zshrc
— kalbasit

@eMxyzptlk, extraño. -ges para evitar restringir el alcance, pero en ~/.zshrc, el alcance ya es global. Además, nunca he visto zshquejarse de un vacío $PATH(a excepción de los errores de comando no encontrado, por supuesto).
— Stéphane Chazelas

3

Agregar export -U PATH=~/foo${PATH:+:$PATH}a uno de sus archivos de inicio. El -Umantiene sólo la primera aparición de un valor en arrays o ciertas :variables de delimitados como PATH.


-3

Tendrás que hacer algo como:

if echo $PATH | grep :newpath: ; then doIfPresent; else doIfMissing; fi

Esto funciona solo si newpathestá delimitado por dos ':', necesita considerar los casos cuando está al principio o al final de manera similar.

Urgh


1
Puede hacerlo dentro del shell, solo con las funciones Bourne / POSIX. Esto evita los dolores de cabeza entre comillas (al menos haga eso echo "$PATH": siempre ponga comillas dobles alrededor de las sustituciones variables ). case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac
— Gilles 'SO- deja de ser malvado'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.