Bash 为什么';t**排序**在每台机器上排序相同?

Bash 为什么';t**排序**在每台机器上排序相同?,bash,unix,sorting,ksh,Bash,Unix,Sorting,Ksh,使用相同的排序命令和相同的输入在不同的机器上产生不同的结果。如何解决此问题?这可能是区域设置差异的结果: $ echo 'CO2_ CO_' | env LC_ALL=C sort CO2_ CO_ $ echo 'CO2_ CO_' | env LC_ALL=en_US sort CO_ CO2_ 将LC_ALL环境变量设置为相同的值应该可以解决问题。这可能是由于环境变量的设置不同造成的排序将使用这些设置来确定如何比较字符串。通过在调用sort之前按照您想要的方式设置这些环境变量,您应该

使用相同的排序命令和相同的输入在不同的机器上产生不同的结果。如何解决此问题?

这可能是区域设置差异的结果:

$ echo 'CO2_
CO_' | env LC_ALL=C sort
CO2_
CO_


$ echo 'CO2_
CO_' | env LC_ALL=en_US sort
CO_
CO2_

将LC_ALL环境变量设置为相同的值应该可以解决问题。

这可能是由于环境变量的设置不同造成的<代码>排序将使用这些设置来确定如何比较字符串。通过在调用
sort
之前按照您想要的方式设置这些环境变量,您应该能够强制它以一种特定的方式运行。

OS X上的说明:

*******警告*******环境指定的区域设置会影响排序顺序。将LC_ALL=C设置为 使用本机字节值的传统排序顺序

这或许可以解释一些事情

如果您的一些系统没有语言环境支持,它们将默认为该语言环境(C),因此您不必在这些系统上设置它。如果您有一些支持区域设置并且想要相同的行为,请在这些系统上设置
LC_ALL=C
。就我所知,这将是让尽可能多的系统以同样的方式运行的方法

如果您没有任何无区域设置的系统,只需确保它们共享区域设置就足够了


有关更多规范信息,请参阅的单个UNIX®规范、版本2说明和实用程序说明。

有关排序的详细信息,请阅读中的。它说

应使用当前区域设置的排序顺序进行比较[…]


当然,
sort
sort的方式取决于脚本运行环境的语言环境设置。

如何将语言环境设置为LC_ALL=C?@Malcolm:许多建议会告诉您导出LC_ALL变量……但这会破坏用户shell设置。请参阅我的答案,将其设置为一个设置范围