Bashrc 함수 케이스 문은 JSON에서 케이스를 가져옵니다.

Bashrc 함수 케이스 문은 JSON에서 케이스를 가져옵니다.

시스템에 대해 더 빨리 배울 수 있도록 .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
  }
"

관련 정보