Bash에서 LC_CTYPE 등의 현재 값을 얻는 방법은 무엇입니까?

Bash에서 LC_CTYPE 등의 현재 값을 얻는 방법은 무엇입니까?

기본적으로 구현하는 방법이것배쉬에서? 구문 분석 의 출력 localedeclare "$(locale | grep ^LC_CTYPE | tr --delete '"')"네 개의 개별 명령을 포함하기 때문에 좋지 않은 것 같습니다. locale대부분 또는 모든 변수의 값이 인쇄된다고 해서 해당 변수가 실제로 설정되었다는 의미는 아닙니다. 예를 들어 내 컴퓨터에서는 (다른 줄과 함께) locale인쇄되지만 아무 것도 인쇄되지 않습니다.LC_CTYPE="en_NZ.UTF-8"echo "$LC_CTYPE"

답변1

평가 결과가 안전하다고 가정합니다 ( 쉘 함수, 별칭 또는 기타 비표준 유틸리티는 locale가정 하지 않음).locale

(eval "$(locale)" && printf '%s\n' "$LC_CTYPE")

이는 LC_하위 쉘 환경에서 모든 관련 변수를 설정하고 해당 값을 인쇄합니다 LC_CTYPE. 하위 쉘 내에서 실행하면 eval변수가 상위 환경을 오염시키는 것을 방지할 수 있습니다 LC_.

OpenBSD 시스템에서 실행되는 예제의 경우 다음만 설정했습니다 LANG=C.UTF-8.

$ (eval "$(locale)" && printf '%s\n' "$LC_CTYPE")
C.UTF-8

보고서에 설정되지 않은 값 LC_CTYPE으로 변수를 설정(및 내보내기) 하려는 경우locale다른변하기 쉬운:

$ export LC_CTYPE="$(eval "$(locale)" && printf '%s\n' "$LC_CTYPE")"
$ printf '%s\n' "$LC_CTYPE"
C.UTF-8

답변2

남자 말에 따르면locale값을 큰따옴표로 묶으면 LC_CTYPE해당 값이 "암시된 값"임을 나타냅니다.

환경에 설정된 변수값은
큰따옴표 없이 출력되며, 암시적 값은 큰따옴표로 출력됩니다.

이는 "암시된" 값이 LC_CTYPE설정되지 않고 인쇄된다는 의미입니다.locale내가 올바르게 이해했다면은 의 값이 되며 LC_ALL, 설정되지 않은 경우에는 다음의 값이 됩니다 LANG.

glibc의 경우 클래스에 관계없이 환경 변수 LC_ALL을 먼저 확인하고, 다음으로 클래스와 동일한 이름의 환경 변수를 확인하고, 마지막으로 LANG 환경 변수를 확인합니다. 첫 번째 기존 환경 변수 사용

따라서 locale찾은 첫 번째 값이 다음 순서로 사용됩니다. LC_ALL설정된 경우 우선 순위가 적용되므로 for 값도 설정되어 LC_CTYPE있더라도 (다른 로케일로) LANG 보고 됩니다 .LC_ALLLC_CTYPElocaleLC_ALLLC_CTYPE

어쨌든 LC_CTYPE현재 사용 중인 값을 얻으려면 locale다음과 같이 실행할 수 있습니다.

echo ${LC_ALL:-${LC_CTYPE:-$LANG}}

처음에는 if의 실제 값을 가져오고 설정되지 않은 경우 LC_CTYPE에만 사용된 값으로 돌아가는 것이 목표라고 생각했습니다 . 이 경우 처음 두 변수를 교체해야 합니다.locale

echo ${LC_CTYPE:-${LC_ALL:-$LANG}}

답변3

출력을 구문 분석 locale한 다음 변수를 설정하려는 경우 다음과 같이 직접 가져올 수 있습니다.

. <(locale | grep '^LC_CTYPE=')

다음 LC_TYPE행만 선택하세요.

$ locale | grep '^LC_CTYPE='
LC_CTYPE="en_US.UTF-8"

그런 다음 .내장 명령을 사용하여 현재 쉘로 가져옵니다.

$ echo $LC_CTYPE 

$ . <(locale | grep '^LC_CTYPE=')
$ echo "$LC_CTYPE"
en_US.UTF-8

이를 위해서는 지원되는 쉘이 필요합니다.프로세스 교체, bash또는 또는 zsh기타 ksh등. 그러한 쉘을 사용하지 않는다면 다음과 같이 좀 더 복잡한 작업을 수행해야 할 수도 있습니다.

locale | grep '^LC_CTYPE=' > file && . ./file

답변4

다음을 제외한 외부 명령을 사용하지 않습니다 locale.

while read -r line; do
    [[ "${line}" =~ ^LC_CTYPE= ]] && {
        export LC_CTYPE="${line#*=}"
        break
    }
done < <(locale)

관련 정보