Recientemente noté lo siguiente en mi perfil de cygwin, más precisamente:
/usr/local/bin:/usr/bin${PATH:+:${PATH}}
Qué significa eso? ¿Por qué no es solo $ PATH? ¿Es esto un 'si existe $ PATH entonces agregue: $ PATH'? Mi propósito es intercambiar el orden y poner las rutas de Cygwin detrás de la ruta de Windows. En el pasado tendría
$PATH:/usr/local/bin:/usr/bin
Pero esto me confunde. Tal vez debería estar haciendo
PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
para agregar el: al final del $ PATH?
shell
path
variable-substitution
tofutim
fuente
fuente
Respuestas:
El
:+
es una forma de expansión de parámetros :En otras palabras, si la variable
$var
está definida,echo ${var:+foo}
imprimiráfoo
y, si no lo está, imprimirá la cadena vacía.El segundo
:
no es nada especial. Es el carácter utilizado como separador en la lista de directorios en$PATH
. Entonces,PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"
es una forma abreviada de escribir:Es solo un truco inteligente para evitar agregar un extra
:
cuando$PATH
no está configurado. Por ejemplo:Pero si no
PATH
está configurado:A
:
por sí mismo agrega el directorio actual al$PATH
. UsarPATH="/new/dir${PATH:+:$PATH}"
evita esto. Entonces, seguro, puede usarloPATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
si lo desea, o puede usarloPATH="$PATH:/usr/local/bin:/usr/bin"
si lo prefiere. La única diferencia es que el primero podría agregar un extra:
, agregando así su directorio actual a su$PATH
.fuente
:
nocivo?$PATH
(vea la respuesta de @ AndyB ). Eso puede ser un riesgo de seguridad en algunas situaciones (por ejemplo, un atacante ha cargado un script destructivo en su directorio actual y lo ha nombradols
o algo así), pero en la mayoría de los casos, realmente no le importa. De hecho, algunos sistemas agregan el directorio actual alPATH
predeterminado de todos modos.csh
manejen, entonces, como una matriz.Estás en lo correcto, significa 'si $ PATH existe, y no es nulo, entonces agrega: $ PATH'.
Debe verificar si $ PATH existe porque no desea agregar los dos puntos iniciales (o finales) si $ PATH no está definido. Un nombre de directorio de longitud cero (nulo) en la ruta, como en
:/usr/local/bin:/usr/bin
, o/usr/local/bin:/usr/bin:
, o/usr/local/bin::/usr/bin
, significa buscar en el directorio actual .Extraído de
man bash
:Eso probablemente no sea lo que quieres hacer.
Las siguientes dos líneas hacen lo mismo:
fuente