Agregar una nueva entrada a la variable PATH en ZSH

188

Estoy usando zsh y estoy tratando de agregar una nueva entrada ( /home/david/pear/bin) a la PATHvariable pero no sé cómo.

Lo que más me confunde es que no hay una sola referencia a una PATHvariable en mi ~/.zshrcarchivo, sino que echo $PATHdevuelve:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Entonces, una PATHvariable se está estableciendo en alguna parte.

David Barreto
fuente

Respuestas:

213

Aquí, agregue esta línea a .zshrc:

export PATH=/home/david/pear/bin:$PATH

EDITAR : Esto funciona, pero la respuesta a continuación es mejor, ya que aprovecha la interfaz estructurada que ZSH proporciona para variables como $PATH. Este enfoque es estándar bash, pero hasta donde yo sé, no hay razón para usarlo cuando ZSH ofrece mejores alternativas.

Linuxios
fuente
29
jaja, olvídalo, pensé que era solo un comando de consola, pero agregar esa línea al .zshrc hizo el truco. ¡Muchas gracias!
David Barreto
1
Mi .zshrc ya tenía una línea para exportar RUTA, así que la reemplacé por la modificada.
Zack Huston
66
Tuve que quitar las comillas dobles alrededor de las entradas, es decir, PATH="/home/david/pear/bin:/usr/bin:etc"que PATH=/home/david/pear/bin:/usr/bin:etcpara que se quede en zshrc.
a7omiton
3
@taco, puedes usar $ HOME
mencargo
1
@DanielSpringer: Sí. Cuando abre un shell, hereda PATHdel proceso principal que lo inició, y luego cuando se ejecuta .zshrc( .bashrco lo que sea), eso es lo que le permite agregar cosas adicionales a esa ruta.
Linuxios
224

En realidad, el uso de ZSH le permite utilizar un mapeo especial de variables de entorno. Entonces simplemente puedes hacer:

# append
path+=('/home/david/pear/bin')
# or prepend
path=('/home/david/pear/bin' $path)
# export to sub-processes (make it inherited by child processes)
export PATH

Para mí, esa es una característica muy clara que se puede propagar a otras variables. Ejemplo:

typeset -T LD_LIBRARY_PATH ld_library_path :
ony
fuente
16
Buena respuesta. En mi caso, ~/.zshrcse obtiene después .profiley sobrescribe todo .profile. Me tomó un tiempo tirar de mi cabello para resolverlo.
Khanh Nguyen
1
El caso de agregar no necesita los parens a menos que esté agregando más de un elemento. También a menudo no necesita las comillas. Entonces, la manera simple y corta de agregar es
Micah Elliott
1
@SuperUberDuper, debe comprender que casi cualquier shell de Unix simplemente lee los archivos de inicio, lo que hace casi lo mismo que si lo escribiera en el shell de forma interactiva. En cuanto a los archivos "RC" que podría encontrar interesante respuesta a esta pregunta
ony
66
Es posible evitar la exportación explícita con -xy dejar solo valores únicos en una variable con -U, se asume dos puntos por defecto, por lo que puede ser:typeset -TUx PATH path
Duelo
2
@DanielSpringer, no. Si lo desea en esos términos, entonces: path=(...)(sin hacer referencia $patho $PATHdentro) asigna, path=(... $path)antepone y path+(...)agrega.
ony
40

Puede agregar a su PATHde una manera mínima. No necesita paréntesis a menos que esté agregando más de un elemento. Tampoco suele necesitar comillas. Entonces, la forma simple y corta de agregar es:

path+=/some/new/bin/dir

Uso común

Entonces el patrón común para probar un nuevo script / ejecutable se convierte en:

path+=$PWD/.
# or
path+=$PWD/bin

Esta sintaxis en minúsculas se utiliza pathcomo una matriz , pero también afecta a su equivalente en mayúsculas, PATHal que está "vinculado" a través de typeset.

(Observe que no :se necesita / desea como separador ).

Cositas relacionadas

Tratar de pathesta manera (como una matriz) también significa: no es necesario hacer una rehash para obtener los comandos recién modificados que se encuentran.

También eche un vistazo vared pathcomo una forma dinámica de editarpath y otras cosas.

Es posible que solo le interese pathesta pregunta, pero como estamos hablando de exportaciones y matrices, tenga en cuenta que las matrices generalmente no se pueden exportar.

Incluso puede evitar PATHtomar entradas duplicadas (consulte esto y esto ):

typeset -U path
Micah Elliott
fuente
¿No debería ser 'ruta + =: / foo / bar'? (con dos puntos)
andrew lorien
1
@andrewlorien Actualicé la respuesta con detalles sobre el separador de colon.
Micah Elliott
Tenga en cuenta que si hay un comentario después de la ruta, entonces necesitamos comillas, como path+='my/path' # for fun. Es obvio si tiene espacios, pero no tanto si tiene comentarios.
Franklin Yu
"(Tenga en cuenta que no: es necesario / deseado como separador)." Esto solo es cierto para las minúsculas path. Se :requiere un precedente para PATH, como sigue en .zshrc PATH+=:/Users/path/to/my/folder
Emmett R.
37

un forro, sin abrir ~/.zshrcarchivo

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc

o

echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc

Para ver el efecto, hazlo source ~/.zshrcen la misma pestaña o abre una nueva pestaña

Siva Praveen
fuente
1
Funcionó perfectamente en OSX con Zsh Shell.
Stryker
1
¡Trabajado como un encanto!
Akbar Sha Ebrahim
14
  1. Se agregó ruta a ~ / .zshrc

    sudo vi ~/.zshrc

    agregar nueva ruta

    export PATH="$PATH:[NEW_DIRECTORY]/bin"
  2. Actualización ~ / .zshrc

    Guardar ~ / .zshrc

    source ~/.zshrc

  3. Comprobar RUTA

    echo $PATH

saneryee
fuente
2
Este es el Bashcamino.
CousinCocaine
13

OPCIÓN 1: Agregue esta línea a ~ / .zshrc:

export "PATH=$HOME/pear/bin:$PATH"

Después de eso, debe ejecutar source ~/.zshrcpara que los cambios surtan efecto O cierre esta ventana y abra una nueva

OPCIÓN 2: ejecútelo dentro de la consola del terminal para agregar esta ruta solo a la sesión actual de la ventana del terminal. Cuando cierre la ventana / sesión, se perderá.

Dimitar
fuente
¿Puede explicar cómo esta respuesta es diferente de la misma respuesta publicada hace 5 años ?
Franklin Yu
en esta respuesta no se dice que debe agregar esta línea de código al archivo, si solo lo ejecuta así, solo cambiará en las ventanas actuales y esto no se explica en la respuesta original
Dimitar