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
.