locale
터미널에서 명령을 실행하면 쉘의 로케일 변수가 인쇄됩니다.
쉘 외에 다른 프로세스의 로케일 변수를 가져올 수 있는 방법이 있습니까?
답변1
Linux의 GNU xargs
:
xargs -r0a "/proc/$pid/environ" sh -c 'exec env -i -- "$@" locale' sh
환경 복사본에서 실행 중인 locale
프로세스의 pid를 $pid
실행한 마지막 명령에 전달합니다.
외부 이므로 locale
쉘 변수(아직 내보내지 않은 경우)가 아닌 환경 변수에만 관심이 있습니다.
LC_*
, , 변수를 내보내지 않더라도 LANG
쉘 자체의 현지화 설정이 영향을 받을 수 있습니다.LANGUAGE
몇 가지 참고사항:
- 현지화를 사용하는 프로그램은 일반적으로
setlocale(LC_ALL, "")
초기화됩니다.모두현지화 설정은 환경을 기반으로 하지만 반드시 그럴 필요는 없습니다. setlocale()
다른 매개변수로 호출 될 수도 있습니다 (가능성은 낮음).- 환경을 수정하기 전이나 후에 호출할 수 있습니다(
putenv()
/etc API 사용setenv()
). - 이러한
putenv()
/setenv()
전통적으로 노출된 영역을 수정하지 않지만/proc/$pid/environ
IIRC는 최신 버전의 Linux 및 GNU libc에서 변경되었습니다. - 해당
putenv()
/ 에 관계없이setenv()
프로세스는 결국 노출되는 스택 영역을 수정할 수 있습니다/proc/$pid/environ
(가능성은 낮음).
또 다른 옵션은 gdb를 프로세스에 연결하고 다음을 수행하는 것입니다.
call system("locale")
그러나 이것은 매우 침해적이다.
프로그램은 프로세스 자체에서 준비된 환경을 사용합니다( environ
및/또는 putenv()
/ 를 사용한다고 가정 setenv()
하지만 모든 응용 프로그램, 특히 쉘이 이를 수행하는 것은 아닙니다).
setlocale()
gdb를 사용하면 실제로 NULL 두 번째 인수로 각 로캘 범주를 호출하여 현지화 설정을 직접 쿼리할 수도 있습니다.
특정 카테고리의 가치를 확인하려면 다음 안내를 따르세요.
$ printf '#include <locale.h>\nLC_COLLATE\n' | gcc -E -x c - | tail -n 1
3
로케일 이름을 인쇄하려면 다음을 수행하십시오 gdb
.
(gdb) p (char*)setlocale(3, 0)
$3 = 0xde8f40 "en_GB.UTF-8"
또는:
(gdb) x/s setlocale(3, 0)
0xde8f40: "en_GB.UTF-8"
답변2
셸 내에서도 호출이 locale
항상 신뢰할 수 있는 결과를 제공하는 것은 아닙니다.
예를 들어 Bourne Shell은 환경 변수를 로컬 쉘 변수로 가져오고 가져온 값을 하위 항목에 전달하지만 동시에 내보낸 값을 수정하지 않고도 관련 로컬 변수를 수정할 수 있습니다. Bourne Shell 로케일 설정은 가져오거나 내보낸 환경이 아닌 쉘 변수의 내부 값을 기반으로 합니다.
이는 LC_* 변수에 적용되므로 Bourne Shell은 locale
명령이 보고하는 것과 다른 로케일에서 실행될 수 있습니다. 참고: set -o posix
Bourne Shell을 호출하여 이를 변경할 수 있습니다. Bourne Shell에 가져온 변수의 내보낸 값을 내부 값과 동기화하도록 지시합니다.
게다가 POSIX.1-2008부터 프로그램이 동시에 여러 로케일을 사용할 수 있는 방법이 있습니다. 예를 들어, 이는 C
특이한 부동 소수점 구분 기호 "."가 있는 미국 로케일에서 부동 소수점 상수를 구문 분석하려는 컴파일러의 경우 중요합니다. 다른 로케일에 따라 경고 및 기타 출력을 계속 제공하면서 사용하십시오.
동일한 접근 방식은 스레드 프로그램이 서로 다른 스레드에 대해 서로 다른 로케일을 사용하도록 지시하는 데 자주 사용됩니다.
보시다시피, 다른 프로그램의 환경을 보면 해당 로캘이 무엇인지에 대한 대략적인 아이디어만 제공될 뿐 실제 부여 결과는 반환되지 않습니다.