Agregar rutas a PATH utilizando una sintaxis de varias líneas

16

Según tengo entendido, la forma habitual de agregar una ruta a la PATHvariable de entorno es concatenando rutas separadas por el :carácter.

Por ejemplo, si quiero añadir tres caminos a la misma /my/path/1, /my/path/2y /my/path/3, me gustaría tener que hacerlo de la siguiente manera:

PATH=$PATH:/my/path/1:/my/path/2:/my/path/3

que no es fácil de leer

¿Hay alguna manera de definir o agregar rutas a la PATHvariable usando una sintaxis de varias líneas ? ¿Quizás usando matrices? Estoy buscando algo como esto:

PATH = 
$PATH
/my/path/1
/my/path/2
/my/path/3

En caso de que haya soluciones interesantes que sean específicas de shell, estoy buscando una solución en zsh.

Amelio Vazquez-Reina
fuente

Respuestas:

12

No sé si funciona en zsh, pero funciona en bash:

PATH=$(paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF
)

Editar e incluso más corto:

PATH=`paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF`

Y sin generar un proceso:

new_path=(
"$PATH"
/my/path/1
/my/path/2
/my/path/3)
OLD_IFS="$IFS"
export IFS=":"
PATH="${new_path[*]}"
export IFS="$OLD_IFS"

Las comillas son importantes cerca de $PATH, $IFS, ${new_path[*]}y $OLD_IFSpara mantener los espacios en la interpretación de variables y evitar la cáscara de IFS.

Update2 con comentarios y gestión de línea vacía usando sed:

PATH=`sed -e '/^#/'d -e '/^$/'d << EOF | paste -d ":" -s 
$PATH
/my/path/1
# This is a comment.
/my/path/2

/my/path/3
EOF`

El carácter de comentario debe ser el primer carácter de la línea y las líneas vacías deben estar completamente vacías. Para administrar espacios y pestañas antes de comentar y en líneas vacías, use sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'den su lugar (pestañas para probar, ya que puede ser específico para la implementación de sed).

jfg956
fuente
Probé el último fragmento en zsh y funciona. También me gusta que sea un poco más limpio (una ruta por línea) que las otras soluciones. ¿Puede la solución acomodar líneas comentadas (caminos)? ¿Qué tal líneas vacías?
Amelio Vazquez-Reina
Actualización con comentarios y gestión de línea vacía.
jfg956
Y con sed, si quieres jugar, puedes evitar el proceso de pegado con un script más complicado.
jfg956
¿Está bien usar sangría para las rutas en la pastesolución?
void.pointer
20

No es una solución interesante en absoluto, pero muy portátil:

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3
Estera
fuente
1
Esto es típico de lo que he visto a lo largo de los años. Uno puede reordenar fácilmente las rutas o incluso cambiar un elemento para que sea PATH = / my / path / 1: $ {PATH} para forzar la preposición.
bsd
1
También puede usar +=para evitar tener que reconstruir completamente la cadena.
Chris Down
Y ni siquiera necesitas usar los frenos. Los dos puntos no se pueden usar en nombres de variables de entorno, por lo que no hay ambigüedad que resolver.
Alexios
+1 por no ser interesante. Interesante puede ser bueno a veces, ¡pero este no es uno de esos momentos! (Especialmente porque el OP mencionó explícitamente "no es fácil de leer" como un problema.)
ruakh
@ChrisDown ¿Hay una sintaxis que antecede sin reconstruir la cadena?
John P
12

En zsh, $pathes una matriz:

path=(
    $path
    ~/.local/bin
    ~/.gem/ruby/2.0.0/bin
)

Nota: ambos pathson minúsculas.

Kabie
fuente
Eso depende del shell, no todos manejan esto.
vonbrand
1
@vonbrand: Sí, pero funciona en zsh. Creo que vale la pena mencionarlo.
Kabie
3
+1 (Esta pregunta está etiquetada con zsh )
Johnsyweb
Dado que el OP preguntó específicamente sobre zsh, esta es la mejor opción
Daniel Serodio, el
1
para cualquier persona interesada en aprender más sobre la distinción $ path vs. $ PATH, consulte esta publicación
mbigras
7

En zsh, si está agregando directorios al final de la ruta:

path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)

Portably: ¿Cómo agregar correctamente una ruta a PATH?

Puede usar calificadores globales para excluir entradas que no son directorios existentes o enlaces simbólicos a los mismos. Esto puede o no ser deseable, dependiendo de si espera que los directorios se agreguen más tarde durante la sesión (por ejemplo, si están en sistemas de archivos remotos). No se puede hacer eso con la path+=/my/pathsintaxis porque el lado derecho está en un contexto de cadena y, por lo tanto, no sufre problemas; puede hacerlo path+=(/my/path)ya que cada elemento de la matriz se expande en un contexto de lista.

path+=(/path/to/app/{i386,share}/bin(-/N))
Gilles 'SO- deja de ser malvado'
fuente