Git을 사용할 수 있고 키 이름에 밑줄을 사용할 수 없다는 제약 조건이있는 경우 git config
범용 INI 파서 / 편집기로 사용할 수 있습니다 .
키 / 값 쌍을 구문 분석하고 =
중요하지 않은 공백을 삭제하고 주석 ( ;
및 및 모두 #
)을 기본적으로 무료로 제공합니다. 아래에 OP의 입력 .ini
및 원하는 출력 (Bash 연관 배열)에 대한 완전한 작업 예가 포함되어 있습니다.
그러나 이와 같은 구성 파일이 주어지면
; mytool.ini
[section1]
inputdir = ~/some/dir
enablesomefeature = true
enablesomeotherfeature = yes
greeting = Bonjour, Monde!
[section2]
anothersetting = 42
… 빠르고 더러운 솔루션 만 필요하다면 Bash 연관 배열에서 설정을한다는 아이디어와 결혼하지 않아도됩니다.
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
현재 환경에서 명명 된 환경 변수를 만듭니다 . 물론 이것은 어떤 값도 마침표 나 공백을 포함하지 않을 것이라고 믿을 수있는 경우에만 작동합니다 (보다 강력한 솔루션은 아래 참조).
다른 간단한 예
쉘 함수를 사용하여 입력을 저장하는 임의의 값 가져 오기 :
function myini() { git config -f mytool.ini; }
별칭도 여기 OK 겠지만, 사람들은 일반적으로 쉘 스크립트 [확대되지 않는 한 , 어쨌든 별칭은 쉘 기능에 의해 대체된다 "거의 모든 목적을 위해,"[ 2 ], 배쉬에 따라 man 페이지 .
myini --list
# result:
# section1.inputdir=~/some/dir
# section1.enablesomefeature=true
# section1.enablesomeotherfeature=yes
# section2.anothersetting=42
myini --get section1.inputdir
# result:
# ~/some/dir
이 --type
옵션을 사용하면 특정 설정을 정수, 부울 또는 경로로 "정식화"할 수 있습니다 (자동 확장 ~
).
myini --get --type=path section1.inputdir # value '~/some/dir'
# result:
# /home/myuser/some/dir
myini --get --type=bool section1.enablesomeotherfeature # value 'yes'
# result:
# true
약간 더 강력하고 빠르고 더러운 예
키 값의 내부 공백을 유지하면서 현재 환경에서와 mytool.ini
같이 모든 변수를 사용 가능하게 SECTIONNAME_VARIABLENAME
하십시오.
source <(
git config -f mytool.ini --list \
| sed 's/\([^.]*\)\.\(.*\)=\(.*\)/\U\1_\2\E="\3"/'
)
sed 표현이 영어로하는 것은
- 기억 기간에 비 기간 문자의 무리를 찾는 등 그
\1
다음,
- 가로 기억, 등호까지 문자의 무리를 발견
\2
하고,
- 등호 뒤의 모든 문자 찾기
\3
- 마지막으로 대체 문자열에서
- 섹션 이름 + 변수 이름은 대문자이며
- 따옴표로 묶지 않은 경우 쉘에 특별한 의미가있는 문자가 포함 된 경우 값 부분은 큰 따옴표로 묶습니다 (공백과 같이).
대체 문자열 ( \U
및 \E
대체 문자열의 해당 부분을 대문자로 표시) 의 및 시퀀스는 GNU sed
확장입니다. macOS 및 BSD에서는 여러 -e
효과를 사용 하여 동일한 효과를 얻을 수 있습니다.
섹션 이름 에 포함 된 따옴표와 공백을 다루는 것은 git config
독자에게 연습으로 남겨둔다.:)
섹션 이름을 Bash 연관 배열의 키로 사용
주어진:
; foo.ini
[foobar]
session=foo
path=/some/path
[barfoo]
session=bar
path=/some/path
이것은 OP가 요구하는 결과를 sed replacement 표현으로 간단히 캡처하여 재 배열하고 GNU sed 없이도 잘 작동합니다.
source <(
git config -f foo.ini --list \
| sed 's/\([^.]*\)\.\(.*\)=\(.*\)/declare -A \2["\1"]="\3"/'
)
실제 .ini
파일 을 인용하는 데 어려움이있을 수 있지만 제공된 예제에서는 작동합니다. 결과:
declare -p {session,path}
# result:
# declare -A session=([barfoo]="bar" [foobar]="foo" )
# declare -A path=([barfoo]="/some/path" [foobar]="/some/path" )