¿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.
@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.
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
Respuestas:
In
zsh
$PATH
está vinculado (vertypeset -T
) a la$path
matriz. Puede forzar que esa matriz tenga valores únicos con:Y luego, agregue la ruta con:
Sin tener que preocuparse si ya estaba allí.
Para agregarlo al frente, haga:
o:
si
~/foo
ya estaba en$path
eso lo moverá al frente.fuente
typeset -Ug path
? Cuando lo usotypeset -U path
en mi~/.zshrc
archivo, siempre recibo un error acerca de que no hay nada en el camino mientras se ejecuta zshrc-g
es para evitar restringir el alcance, pero en~/.zshrc
, el alcance ya es global. Además, nunca he vistozsh
quejarse de un vacío$PATH
(a excepción de los errores de comando no encontrado, por supuesto).Agregar
export -U PATH=~/foo${PATH:+:$PATH}
a uno de sus archivos de inicio. El-U
mantiene sólo la primera aparición de un valor en arrays o ciertas:
variables de delimitados como PATH.fuente
Tendrás que hacer algo como:
Esto funciona solo si
newpath
está delimitado por dos ':', necesita considerar los casos cuando está al principio o al final de manera similar.Urgh
fuente
echo "$PATH"
: siempre ponga comillas dobles alrededor de las sustituciones variables ).case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac