¿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.

Andrew Ferrier
fuente
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.

Stéphane Chazelas
fuente
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.

llua
fuente
-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

vonbrand
fuente
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'