Ayarlanmamışsa önde gelen iki nokta üst üste işareti oluşturmadan PATH benzeri değişkene ekle


10

Bir dizin eklemem gerekiyor PKG_CONFIG_PATH. Normalde, standardı kullanırdım

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

ancak PKG_CONFIG_PATHdaha önce sistemime yüklenmemiş. Bu nedenle, değişken :önce geçerli dizine bakmasını söyleyen bir karakterle başlar . Bunu istemiyorum. Aşağıdakilere karar verdim,

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

ama bu çok çirkin gözüküyor. Daha iyi bir yol var mı? Yalnızca değişken zaten ayarlanmışsa, iki nokta üst üste koşullu olarak eklemenin uygun yolu nedir?


Yanıtlar:


13

${:+}Genişletme operatörü ile doğru yoldasınız , sadece biraz değiştirmelisiniz:

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

İlk parantezler genişler $V ve kolon iff Vzaten başka bir şeye ayarlanmaz - tam olarak ihtiyacınız olan şeydir (ve muhtemelen operatörün varlığının nedenlerinden biri).

Böylece sizin durumunuzda:

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

O formu kullanarak, ama (biraz) daha az okunabilir hissettim çünkü ben buna karşı karar: ${V}${V:+:}WVS. ${V:+${V}:}W. Her iki durumda da, ikisi de gerçekten çirkin hissediyorlar. Bir şey umuyordum ... daha zarif, sanırım?
scottbb

@scottbb - bu sözdizimi formu - bu nasıl yapılır. Bir değişkenin değerini bir koşula göre ayarlamak istiyorsanız, bir test yapmanız gerekir. Burada yazıldığı gibi bir satır içi test yapabilir veya açık bir şekilde test edebilirsiniz test- her iki şekilde de değeri test edip varname'yi iki kez yazıyorsunuz, ancak bu şekilde tek bir yürütme ifadesinde yapıyorsunuz - bu şekilde pratik , ama hiç zarif bir bilgisayarla tanışmadım .
mikeserv

@scottbb Bunu düşünmek gerçekten aynı. Ama korkarım daha iyi olamazsınız, çünkü temelde koşulda ve daha sonra genişlemede değişken isme ihtiyacınız var - Bunu sadece bir olayla yapacak bir kabuk yapısı olduğunu düşünmüyorum adlandırın.
peterph

Muhtemelen daha "zarif" bir çözüm aradığımı söylemekten daha hassas olmalıydım. Bunu gerçekten PATH tarzı değişkenlere alt dizeler eklemek için yapıldığını görmedim ve bir şekilde daha iyi bir yolu eksik gibi hissettim. Deneyimlerime göre, bu hissi aldığımda, genellikle daha iyi bir yol var. Bunu söylemeliydim. Ama ne demek istediğin iyi. Yanıtınız için teşekkürler. Ayrıca: @ peterph'in yorumunda yaptığınız düzenlemelerden birinde, tüm argümanı alıntılamam gereken yorumu yaptınız export. Bu çok iyi bir nokta, ben de bu ayrıntıyı karıştırdım.
scottbb

@scottbb - bunun aşındırıcı olduğu ortaya çıktığında özür dilerim - bilgi işlem konusunda zarafet kavramını hiç anlamadım . bir bilgisayar bir makinedir - milyarlarca kez üç yollu ve / veya geçitli bir bileşiktir. birden fazla sayılamaz - her şekilde, yaptığı her şey kaba-zorlanır . bazı sezgisel kavramların çevrilmesi diğerlerinden daha kolay olabilir, ancak eğer öyleyse, bu sadece kavramın diğer kaba-kaba soyutlamaların üstüne oturmasıdır. bilgi işlem, kalbinde, her zaman zarif olmaktan başka bir şey değildir.
mikeserv

1

Son zamanlarda, ben kurmak GNU istifleme altında kütüphaneler gibi mağaza kullanıcı çapında şeyler benim makinelerde ~/.localtanımlarken sıkıntılar içine ve ran LD_LIBRARY_PATH, CPATHve LIBRARY_PATH, yanlışlıkla orada iki nokta üst üste koyarak ve böylece malzeme kırma.

Sonra sorunuzu buldum ve cevap tam olarak zarif değildi ;-) ve bunu ele almak için küçük bir işlev yazdım, lütfen burada bulabilirsiniz: https://gist.github.com/rico-chet/0229e4c080d9f51a02535dd25a656a8a

## Copyright (C) 2018 Alex Thiessen <alex.thiessen.de+github@gmail.com>
## Copyright (C) 2018 https://unix.stackexchange.com/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 "${*}")"
}

// @Kusalananda tarafından önerildiği gibi düzenlendi


Ayrıca:( IFS=:; set -- 1 2 3 4 5 6; echo "$*" )
Kusalananda

Ie:join () { var=$1; shift; export "$var"="$( IFS=:; echo "$*" )"; }
Kusalananda

... "katılmak" dışında, aynı zamanda standart bir yardımcı programın adı olarak talihsiz bir isim.
Kusalananda

Güzel olan, değişkenin üzerine yazmak yerine üzerine yazmanız dışında. Sadece ${!variable:+${!variable}:}doğru yere ekleyerek benim için çalıştı, tüm testler geçti. Uygun bir isim bulmak okuyucu için bir exersize olduğunu :)
Superlexx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.