Почему **sort** не сортирует одинаково на всех машинах?

StackOverflow https://stackoverflow.com/questions/28881

  •  09-06-2019
  •  | 
  •  

Вопрос

Используя тот же Сортировать команда с одним и тем же входом дает разные результаты на разных машинах.Как мне это исправить?

Это было полезно?

Решение

А справочная страница в OS X говорит:

******* ПРЕДУПРЕЖДЕНИЕ ******* Языковой стандарт, указанный в среде, влияет на порядок сортировки.Установите LC_ALL = C, чтобы получить традиционный порядок сортировки, который использует собственные значения байтов.

что могло бы объяснить вещи.

Если некоторые из ваших систем не поддерживают локаль, по умолчанию они будут использовать эту локаль (C), поэтому вам не придется устанавливать ее для них.Если у вас есть программы, поддерживающие локали и требующие такого же поведения, установите LC_ALL=C на этих системах.Это был бы способ заставить как можно больше систем, которые я знаю, делать это одинаково.

Если у вас нет систем без локали, вероятно, будет достаточно просто убедиться, что они используют одну локаль.

Для получения дополнительной канонической информации см. описание Единой спецификации UNIX®, версия 2. локаль, переменные среды, setlocale() и описание сортировка(1) полезность.

Другие советы

Это может быть результатом различий в локали:

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


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

Установка того же значения для переменной среды LC_ALL должна решить проблему.

Вероятно, это связано с разными настройками переменные среды локали. sort будет использовать эти настройки, чтобы определить, как сравнивать строки.Установив эти переменные среды так, как вы хотите, перед вызовом sort, вы должны иметь возможность заставить его вести себя определенным образом.

Больше, чем вы когда-либо хотели знать о sort, прочтите спецификация sort в Единая спецификация Unix v3.Говорится

Сравнения [...] должны выполняться с использованием последовательности сопоставления текущей локали.

Оууу, как sort сортировка зависит от настроек локали (языка) среды, в которой выполняется сценарий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top