시스템에 대해 더 빨리 배울 수 있도록 .bashrc 기능을 만들고 있습니다. 나는 가고 싶은 곳을 설명하기 위해 사례 설명을 사용합니다.
function da() {
case "$1" in
home) cd ~
;;
eolas) cd /home/eolas/
;;
esac
}
JSON 파일에서 사례를 가져오고 싶습니다. 예를 들면 다음과 같습니다.
{
"cases": {
"home": "~",
"eolas": "/home/eolas/",
"jdan": "/home/jdan/",
"kl": "/.kl/"
}
}
나는 이것을 할 수 있는 방법을 찾고 있었지만 지금까지 찾지 못했습니다. 이것이 bash에서 가능합니까? 그렇다면 어떨까요?
답변1
JSON 파일이 있는 경우 자동으로 사용을 고려해야 합니다.잭그것을 분석하기 위해.
파일을 연관 배열로 읽어야 합니다.
declare -A __dirmap
while IFS=$'\t' read -r name dir; do
[[ $dir == "~" ]] && __dirmap[$name]=$HOME || __dirmap[$name]=$dir
done < <(
jq -r '.cases | to_entries[] | [.key, .value] | @tsv' file.json
)
그러면 함수는 다음과 같습니다.
function da() {
if [[ -v __dirmap[$1] ]]; then
cd "${__dirmap[$1]}"
else
echo "No mapping for $1" >&2
fi
}
답변2
귀하의 JSON을 사용하여 사례 태그와 해당 디렉터리의 연관 배열을 구축하겠습니다. 이 작업은 파일에서 한 번만 수행할 수 있습니다 ~/.bashrc
.
unset _da_map
declare -A _da_map
if [ -f da_map.json ]; then
eval "$(
jq -r '.cases | to_entries[] |
@sh "_da_map[\(.key)]=\(.value)"' da_map.json
)"
fi
da_init
(또는 파일이 변경될 때 호출할 수 있도록 별도의 함수에 넣습니다 da_map.json
.)
이 명령문은 평가할 jq
여러 변수 할당을 구성합니다 . eval
이 @sh
연산자는 쉘의 연관된 문자열을 참조합니다. 주어진 예에서는 다음 코드가 실행됩니다.
_da_map['home']='~'
_da_map['eolas']='/home/eolas/'
_da_map['jdan']='/home/jdan/'
_da_map['kl']='/.kl/'
이 da
함수는 다음과 같이 작성할 수 있습니다.
da () {
command cd -- "${_da_map["$1"]?No mapping for label "'$1'"}"
}
이는 cd
주어진 인수와 연관된 디렉토리에 대해 이전에 생성된 연관 배열을 사용합니다. 지정된 인수에 대한 매핑이 발견되지 않으면 확장 프로그램에서 오류가 발생합니다.
$ da "hello world"
bash: _da_map["$1"]: No mapping for label 'hello world'
이 간단한 접근 방식의 한 가지 문제점은 JSON 파일의 디렉터리 값에서 물결표 확장(또는 해당 문제에 대한 변수 확장)을 허용하지 않는다는 것입니다. 따라서 ~
변수가 있는 경로와 변수가 없는 경로를 작성해야 합니다.
답변3
완전히 우아하지는 않지만 작동하는 것 같습니다.
in='
{
"cases": {
"home": "~",
"eolas": "/home/eolas/",
"jdan": "/home/jdan/",
"kl": "/.kl/"
}
}
'
case="$(echo "$in" |
perl -pe 's/"cases". \{/case "\$1" in/;
s/: /) eval cd /;
s/,/;;/;
s/[{}]//g')"
eval "
function da() {
$case
esac
}
"