모든 프로세스의 로케일 변수를 얻는 방법은 무엇입니까?

모든 프로세스의 로케일 변수를 얻는 방법은 무엇입니까?

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/environIIRC는 최신 버전의 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 posixBourne Shell을 호출하여 이를 변경할 수 있습니다. Bourne Shell에 가져온 변수의 내보낸 값을 내부 값과 동기화하도록 지시합니다.

게다가 POSIX.1-2008부터 프로그램이 동시에 여러 로케일을 사용할 수 있는 방법이 있습니다. 예를 들어, 이는 C특이한 부동 소수점 구분 기호 "."가 있는 미국 로케일에서 부동 소수점 상수를 구문 분석하려는 컴파일러의 경우 중요합니다. 다른 로케일에 따라 경고 및 기타 출력을 계속 제공하면서 사용하십시오.

동일한 접근 방식은 스레드 프로그램이 서로 다른 스레드에 대해 서로 다른 로케일을 사용하도록 지시하는 데 자주 사용됩니다.

보시다시피, 다른 프로그램의 환경을 보면 해당 로캘이 무엇인지에 대한 대략적인 아이디어만 제공될 뿐 실제 부여 결과는 반환되지 않습니다.

관련 정보