为什么推荐使用"LANG=C;sudo apt-get clean"等命令?

我在这个维基页面上看到了:软件包管理器故障排除流程
页面中有一些命令,例如:
LANG=C;sudo apt-get clean
LANG=C;sudo apt-get autoclean
LANG=C;sudo apt-get -f install
LANG=C;sudo apt-get --fix-missing install
LANG=C;sudo apt-get --purge autoremove
LANG=C;sudo apt-get --fix-missing update -o APT::Cache-Limit=100000000
LANG=C;sudo apt-get update -o APT::Cache-Limit=100000000 && sudo apt-get dist-upgrade

那么,LANG=C;的目的是什么?

3几个相关的问题:1. LANG=C 在一些 /etc/init.d/* 脚本中出现。LANG=C 是什么意思,为什么需要设置 LANG=C?,2. 为什么是 "LANG=C"?(不是 D 或 E 或 F),3. http://unix.stackexchange.com/questions/87745/what-does-lc-all-c-do。 - usmanayubsh
9请注意,该文档使用了错误的命令——应该是 LANG=C command 而不是 LANG=C;command。第一种形式强制在 command 的持续时间内使用 LANG 环境变量的值,而第二种形式实际上是两个命令,其中第一部分只设置一个本地(未导出)变量,第二部分运行命令而不设置所需的环境变量。 - Guss
2@Guss:实际上,分号也可以起作用。为什么呢?因为当你打开终端窗口时,LANG是一个已存在的环境变量,如果你将其值作为单独的命令进行更改,那个值将成为有效的环境变量,直到你再次更改它或进程结束。 - Gunnar Hjalmarsson
3@Gunnar - 这是不正确的:可能LANG在环境中,所以它可能会与多余的分号一起工作;但这是(1)多余的,因为在命令之间不会改变LANG。此外,提示某人以这种方式运行命令是(2)错误的,因为这样做会不必要地和未经邀请地改变环境,并且(3)这为任何不了解情况的用户提供了一个错误的模式,后续再次应用时可能使用一个不在环境中的shell变量,从而对需要正确、可能安全地运行的命令产生任何影响。 - FooF
这是一个很好的问题,但由于错误地包含了“;”符号,我认为不应该点赞,因为会有给出错误示例的风险。 - FooF
@Guss实际上它将LANG变量设置为C,只是这种设置是永久的,而不是每个命令都需要设置。 - Braiam
2@Braiam 我对语法很熟悉,但需要注意的是,除非变量被导出,否则命令将无法识别它。LANG是一个标准环境变量,默认情况下会被导出 - 但其他变量可能没有被导出,提问者应该意识到这一点。 - Guss
为什么要使用LANG=C;sudo apt-get而不是LANG=C sudo apt-get - Rui F Ribeiro
@FooF, @Rui F Ribeiro, 在我提供的维基链接中,LANG=C; 是原文如何写的。除了省略了我问题中没有提到 LANG=C; 的命令之外,我没有做任何修改。 - DK Bose
@Guss:出于我所说的原因,使用LANG作为单独的命令(例如LANG=C ;),它会在命令之间发生变化,并且在后续命令中添加LANG=C ;是多余的。因此,即使问题中的示例可以工作,它确实是误导性的,我同意你和其他人指出这一点的观点。页面EnvironmentVariables对此进行了更好的解释。 - Gunnar Hjalmarsson
1@DKBose - 我创建了一个账户来修复维基页面,但是发现所涉及的页面是不可更改的。 - FooF
@FooF,谢谢你的尝试。也许编辑该页面需要特殊权限? - DK Bose
@FooF,我也尝试了,得到了“不可变”的结果。我记得最近有一个黑客事件(?),可能导致了对谁可以做什么的限制。 - DK Bose
也许有人像 @bodhi.zazen 这样的人可以帮忙? - DK Bose
1@FooF,请查看http://ubuntuforums.org/showthread.php?t=2308813,关于维基页面的封锁问题。 - DK Bose
3个回答

如果你在解决问题,迟早会在某个论坛或者这里发布你的结果。
当这种情况发生时,其他用户要理解你的日志和输出就更简单了,只要它们没有国际化。
也就是说,如果你使用法语、中文、印地语或其他语言作为系统语言,输出很可能会使用该语言的术语,这样就更难理解发生了什么。 C 语言环境 强制使用默认输出(通常是纯 ASCII 英语)。
最好以以下方式开始故障排除会话:
export LC_ALL=C

不需要设置特定的区域变量,也不需要仅为特定命令设置它。

LANG=C会使您的终端输出回退到默认语言环境。正如本指南建议您将输出发送到Launchpad以寻求支持,他们要求您这样做是为了在您粘贴时,其他人无论使用何种语言都能够阅读。


虽然这可能不适用于apt,因为我认为它是一个非常稳定的软件,但还是有一点需要补充:

有些程序在使用与C或en_US不同的LANG设置时常常表现不良。

Unity(和基于Unity的游戏)以前(或现在)存在这些问题,Unreal Engine也有些问题。此外,一些用于Android的构建脚本只能在LANG=C 的条件下正常运行,或者只有在设置了这个环境变量后编译才成功。

因此,这也可以作为故障排除的一种方法,因为在这种设置下可能根本不会出现错误。