Git'iniz varsa ve anahtar adlarında alt çizgi kullanamama kısıtlaması ile sorun yaşıyorsanız, git config
genel amaçlı bir INI ayrıştırıcısı / düzenleyicisi olarak kullanabilirsiniz.
Anahtar / değer çiftini ayrıştıracak =
ve önemsiz boşlukları kaldıracak , ayrıca (hem ;
ve hem de #
) yorum alıyorsunuz ve temel olarak ücretsiz olarak baskı yazıyorsunuz . .ini
Aşağıda OP'nin girişi ve istenen çıkışı (Bash ilişkisel dizileri) için tam bir çalışma örneği ekledim.
Ancak, böyle bir yapılandırma dosyası verildiğinde
; mytool.ini
[section1]
inputdir = ~/some/dir
enablesomefeature = true
enablesomeotherfeature = yes
greeting = Bonjour, Monde!
[section2]
anothersetting = 42
… Sadece hızlı ve kirli bir çözüme ihtiyacınız varsa ve bir Bash ilişkisel dizisindeki ayarlara sahip olma fikriyle evli değilseniz, şu kadar az şeyden kurtulabilirsiniz:
eval $(git config -f mytool.ini --list | tr . _)
# or if 'eval' skeeves you out excessively
source <(git config -f mytool.ini --list | tr . _)
sectionname_variablename
mevcut ortamda adlandırılan ortam değişkenlerini oluşturur . Bu, elbette, yalnızca değerlerinizden hiçbirinin bir nokta veya boşluk içermeyeceğine güveniyorsanız çalışır (daha sağlam bir çözüm için aşağıya bakın).
Diğer basit örnekler
Yazmayı kaydetmek için kabuk işlevi kullanarak rasgele değerler getiriliyor:
function myini() { git config -f mytool.ini; }
Bash man sayfasına göre, bir takma ad da tamam olurdu, ancak normal olarak bir kabuk komut dosyasında [ 1 ] genişletilmez ve yine de takma adların yerine "hemen hemen her amaç için" [ 2 ] kabuk işlevleri geçer .
myini --list
# result:
# section1.inputdir=~/some/dir
# section1.enablesomefeature=true
# section1.enablesomeotherfeature=yes
# section2.anothersetting=42
myini --get section1.inputdir
# result:
# ~/some/dir
İle --type
seçeneği, sen tamsayılar, Boolean, ya yollar (otomatik genişleyen olarak can "canonicalize" özel ayarlar ~
):
myini --get --type=path section1.inputdir # value '~/some/dir'
# result:
# /home/myuser/some/dir
myini --get --type=bool section1.enablesomeotherfeature # value 'yes'
# result:
# true
Biraz daha sağlam çabuk ve kirli örnek
Tüm değişkenleri geçerli ortamdaki mytool.ini
gibi kullanılabilir yapın SECTIONNAME_VARIABLENAME
ve anahtar boşluklarda dahili boşlukları koruyun:
source <(
git config -f mytool.ini --list \
| sed 's/\([^.]*\)\.\(.*\)=\(.*\)/\U\1_\2\E="\3"/'
)
Sed ifadesinin İngilizce yaptığı şey,
- bir döneme kadar bir dizi dönem olmayan karakter bulmak, bunu hatırlamak
\1
,
- eşit sayıda işarete kadar bir grup karakter bulmak, bunu hatırlamak
\2
ve
- eşittir işaretinden sonra tüm karakterleri bulma
\3
- son olarak, yedek dizede
- bölüm adı + değişken adı üst kasalı ve
- eğer tırnak işareti belirtilmemişse kabuk için özel bir anlamı olan karakterler içermesi durumunda (boşluk gibi) değer bölümü çift tırnak içine alınır
\U
Ve \E
değiştirme dizesi diziler (ki değiştirme dizisinin parçası, üst durum) GNU olan sed
uzantı. MacOS ve BSD'de -e
aynı efekti elde etmek için yalnızca birden fazla ifade kullanırsınız.
Bölüm adlarında ( git config
izin veren) gömülü tırnak işaretleri ve boşluklarla ilgilenmek okuyucu için bir alıştırma olarak bırakılmıştır.:)
Bölüm adlarını Bash ilişkilendirilebilir dizisine anahtar olarak kullanma
Verilen:
; foo.ini
[foobar]
session=foo
path=/some/path
[barfoo]
session=bar
path=/some/path
Bu, OP'nin istediği sonucu, sadece sed değiştirme ifadesindeki bazı yakalamaları yeniden düzenleyerek üretecek ve GNU sed olmadan iyi çalışacaktır:
source <(
git config -f foo.ini --list \
| sed 's/\([^.]*\)\.\(.*\)=\(.*\)/declare -A \2["\1"]="\3"/'
)
Gerçek dünya .ini
dosyası için alıntı yaparken bazı zorluklar olabileceğini tahmin ediyorum , ancak sağlanan örnek için çalışıyor. Sonuç:
declare -p {session,path}
# result:
# declare -A session=([barfoo]="bar" [foobar]="foo" )
# declare -A path=([barfoo]="/some/path" [foobar]="/some/path" )