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

Pregunta:

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 $ PATH existe, entonces agregue: $ PATH'? Mi propósito es cambiar el orden y poner las rutas cygwin detrás de la ruta de Windows. En el pasado hubiera

$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: al final de $ PATH?

Respuesta:

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á por nulo; de lo contrario, se sustituirá la expansión de palabra (o una cadena vacía si se omite la palabra).

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:

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 $PATH no está configurado. Por ejemplo:

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

Pero si PATH está configurado:

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

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

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım