기본적으로 구현하는 방법이것배쉬에서? 구문 분석 의 출력 locale
은 declare "$(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_ALL
LC_CTYPE
locale
LC_ALL
LC_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)