Agregue a la variable de tipo RUTA sin crear dos puntos iniciales si no está configurado

10

Necesito agregar un directorio a PKG_CONFIG_PATH. Normalmente, usaría el estándar

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$(pyenv prefix)/lib/pkgconfig

pero PKG_CONFIG_PATHno se ha configurado previamente en mi sistema. Por lo tanto, la variable comienza con un :carácter, que le dice que busque primero en el directorio actual. No quiero eso. Me decidí por lo siguiente,

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}${PKG_CONFIG_PATH:+:}$(pyenv prefix)/lib/pkgconfig

Pero eso parece tan feo. ¿Hay una mejor manera? ¿Cuál es la forma apropiada de agregar condicionalmente los dos puntos si y solo si la variable ya se ha establecido?

scottbb
fuente
1
stackoverflow.com/questions/9631228/…
sancho.s ReinstateMonicaCellio

Respuestas:

13

Está en el camino correcto con el ${:+}operador de expansión, solo necesita modificarlo ligeramente:

V=${V:+${V}:}new_V

Las primeras llaves se expanden $V y los dos puntos iff Vya están configurados de otra manera en nada, que es exactamente lo que necesita (y probablemente también una de las razones de la existencia del operador).

Así en tu caso:

export "PKG_CONFIG_PATH=${PKG_CONFIG_PATH:+${PKG_CONFIG_PATH}:}$(pyenv prefix)/lib/pkgconfig"
Peterph
fuente
Yo estaba usando esa forma, pero decidí no hacerlo porque se sentía (un poco) menos legible: ${V}${V:+:}Wvs ${V:+${V}:}W. De cualquier manera, ambos se sienten realmente feos. Esperaba algo ... más elegante, supongo.
scottbb
@scottbb - esta es la forma de sintaxis - así es como se hace. Si desea establecer el valor de una variable en función de una condición, debe hacer una prueba. Puede hacer una prueba en línea como está escrito aquí, o puede hacer una prueba explícita con test- de cualquier manera está probando el valor y escribiendo el nombre de var dos veces, pero de esta manera lo hace en una sola declaración de ejecución - de esa manera es práctico , pero nunca he conocido una computadora elegante .
mikeserv
@scottbb Pensarlo realmente es lo mismo. Pero me temo que no lo mejorará, ya que básicamente necesita el nombre de la variable en la condición y luego en la expansión; no creo que haya una construcción de shell que lo haga con solo una aparición de la nombre.
Peter
@mikeserv - Probablemente debería haber sido más preciso que decir que estaba buscando una solución más "elegante". Nunca he visto esto hecho para agregar subcadenas a las variables de estilo PATH, y de alguna manera me pareció que me faltaba una mejor manera. En mi experiencia, cuando tengo ese sentimiento, generalmente hay una mejor manera. Eso es lo que debería haber dicho. Pero su punto está bien tomado. Gracias por su respuesta. Además: en una de sus ediciones del comentario de @peterph, hizo el comentario al que debería haber citado todo el argumento export. Ese es un muy buen punto, también expresé ese detalle.
scottbb
@scottbb, perdón si eso resultó ser abrasivo, nunca he entendido el concepto de elegancia con respecto a la informática. una computadora es una máquina: un tripartito y / o compuerta compuesto miles de millones de veces. no puede contar más de uno: en todos los sentidos, todo lo que hace es forzado por la fuerza bruta . Algunos conceptos intuitivos pueden ser más fáciles de traducir que otros, pero, de ser así, es solo porque el concepto se encuentra sobre otra abstracción forzada por la fuerza bruta. La informática, en el fondo, siempre es cualquier cosa menos elegante.
mikeserv
1

Últimamente, configuré GNU para guardar en mis máquinas para almacenar cosas de todo el usuario, como bibliotecas, ~/.localy me encontré con problemas al definir LD_LIBRARY_PATH, CPATHy LIBRARY_PATHsin querer poner dos puntos allí y romper cosas.

Luego encontré su pregunta y la respuesta no fue exactamente elegante ;-), y escribí una pequeña función para manejar esto, por favor encuéntrela aquí: https://gist.github.com/rico-chet/0229e4c080d9f51a02535dd25a656a8a

## Copyright (C) 2018 Alex Thiessen <[email protected]>
## Copyright (C) 2018 /unix//users/116858/kusalananda
## SPDX-License-Identifier: GPL-2.0-or-later
## <https://spdx.org/licenses/GPL-2.0-or-later.html>

function join() {
    if [ ${#} -eq 0 ]
    then
        echo "\`join\` appends elements separated by colons to a \`bash\` variable " >&2
        echo "usage: join <variable> <element> [element ...]" >&2
        return 1
    fi
    variable="${1}"

    shift
    export ${variable}="${!variable:+${!variable}:}$(IFS=:; echo "${*}")"
}

// editado según lo sugerido por @Kusalananda

Superlexx
fuente
También:( IFS=:; set -- 1 2 3 4 5 6; echo "$*" )
Kusalananda
Es decir:join () { var=$1; shift; export "$var"="$( IFS=:; echo "$*" )"; }
Kusalananda
... Excepto que "unirse" es un nombre desafortunado ya que también es el nombre de una utilidad estándar.
Kusalananda
Buena, excepto por el hecho de que sobrescribiría la variable en lugar de agregarla. Solo agregar ${!variable:+${!variable}:}en el lugar correcto funcionó para mí, todas las pruebas pasaron. Encontrar un nombre apropiado es un exersize para el lector :)
Superlexx