¿Qué significa $ {PATH: +: $ {PATH}}?


25

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?


1
El título de su pregunta realmente se metió con el formato en la barra lateral SE Hot Questions i.imgur.com/g6pPmzf.png
Brad

Respuestas:


39

El :+es una forma de expansión de parámetros :

$ {parámetro: + [palabra]} : Usar valor alternativo.

Si el parámetro no está establecido o es nulo, se sustituirá nulo; de lo contrario, se sustituirá la expansión de la palabra (o una cadena vacía si se omite la palabra).

En otras palabras, si la variable $varestá definida, echo ${var:+foo}imprimirá fooy, 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:

if [ -z "$PATH" ]; then
    PATH=/usr/local/bin:/usr/bin
else
    PATH=/usr/local/bin:/usr/bin:$PATH
fi

Es solo un truco inteligente para evitar agregar un extra :cuando $PATHno está configurado. Por ejemplo:

$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin

Pero si no PATHestá configurado:

$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:

A :por sí mismo agrega el directorio actual al $PATH. Usar PATH="/new/dir${PATH:+:$PATH}"evita esto. Entonces, seguro, puede usarlo PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"si lo desea, o puede usarlo PATH="$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.


¿Es el extra :nocivo?
gato

44
@tac no realmente, simplemente agrega el directorio actual a su $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 nombrado lso algo así), pero en la mayoría de los casos, realmente no le importa. De hecho, algunos sistemas agregan el directorio actual al PATHpredeterminado de todos modos.
terdon

la ruta es el único lugar donde preferiría que la cshmanejen, entonces, como una matriz.
Hometoast

8

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:

   PATH   ...
          A zero-length (null) directory name in the value of PATH indicates 
          the current directory.  A  null  directory name may appear as two 
          adjacent colons, or as an initial or trailing colon.
          ...

Eso probablemente no sea lo que quieres hacer.

Las siguientes dos líneas hacen lo mismo:

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.