这是一个小的测试 C 程序,它只是故意崩溃:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *l = getenv("LANG");
printf("LANG = %s\n", l);
int *ptr = (int*)0x12345;
*ptr = 12345;
return 0;
}
“输出”:
$ ./a.out
LANG = ru_RU.UTF-8
Ошибка сегментирования
崩溃的信息是俄语,符合LANG环境变量值,ok。现在,我想查看有关崩溃的英文消息(“分段错误”), 但使用显式“LANG=C”运行程序不起作用:
$ LANG=C ./a.out
LANG = C
Ошибка сегментирования
为什么消息仍然是翻译的?
我的系统:Linux Mint 21.3(弗吉尼亚),gcc 11.4.0。
$ locale -a
C
C.utf8
...
当您将变量赋值放在命令开头时,环境变量仅导出到执行该命令的子进程,而不是当前 shell 进程的环境中。
当进程因信号而崩溃时,信号的描述由shell进程写入。所以它使用的是你原来的
LANG
环境,而不是子进程的环境。
要在
LANG=C
中获取错误消息,您需要从子 shell 运行该程序:
LANG=C bash -c './a.out'