Вопрос или проблема
У меня две системы: Ubuntu 24.04 и Ubuntu 24.10. Возможно, локали различаются, но это не связано с моей проблемой.
На Ubuntu 24.04:
$ printf "%7d %7.2f %8.3f\n" 123 123.45 45
123 123.45 45.000
что и ожидалось. Но на Ubuntu 24.10:
$ printf "%7d %7.2f %8.3f\n" 123 123.45 45
123 -nan -nan
На обеих системах:
$ type printf
printf это встроенная команда оболочки
Так что это должно быть связано с версией Bash (5.2.21(1) против 5.2.32(1)).
Есть ли кто-то, кто сталкивался с такой же проблемой?
Примечание: /bin/printf
похоже работает нормально на обеих системах.
Ответ или решение
При возникновении проблемы с выводом значений -nan
при использовании командного встроенного инструмента printf
в Bash на системе Ubuntu 24.10, важно рассмотреть несколько аспектов, включая версии Bash, обработки плавающих точек, а также настройки локали.
Суть проблемы
Вы наблюдаете различия в выводе между двумя версиями Ubuntu, где команда printf
на Ubuntu 24.04 работает корректно и выводит ожидаемые значения, тогда как на Ubuntu 24.10 вместо этого вы получаете -nan
для значений с плавающей запятой. Это указывает на возможные проблемы с обработкой чисел с плавающей запятой в новейшей версии Bash.
Возможные причины
-
Версия Bash:
На Ubuntu 24.10 установлена более новая версия Bash (5.2.32), в отличие от 24.04 (5.2.21). Различия в версиях могут касаться не только новых особенностей, но и исправлений, которые могли повлиять на работу встроенных команд, таких какprintf
. -
Форматирование плавающих значений:
Встроенноеprintf
в Bash может по-разному обрабатывать числа с плавающей запятой, особенно в случае, когда одно или несколько значений не инициализированы должным образом или их вычисление приводит к неопределённому результату (nan
— not-a-number). -
Локали:
Хотя вы упомянули, что вероятно это не связано с локалями, все же стоит проверить, какие локали установлены по умолчанию в обеих системах. Различия в локали могут влиять на форматирование чисел, например, использование точки или запятой в качестве десятичного разделителя.
Решения и рекомендации
-
Использование
/bin/printf
:
Поскольку вы отметили, что/bin/printf
работает корректно, лучше использовать именно этот вариант для форматирования. Это стандартная реализацияprintf
, которая не имеет зависимостей от версии Bash. Пример использования:/bin/printf "%7d %7.2f %8.3f\n" 123 123.45 45
-
Проверка переменных среды:
Проверьте, установлены ли переменные среды, такие какLANG
иLC_NUMERIC
, одинаковыми на обеих системах. Эти переменные могут влиять на поведение программного обеспечения, особенно в контексте чисел с плавающей точкой и их форматирования.echo $LANG echo $LC_NUMERIC
-
Обновление системы:
Если проблема сохраняется, рассмотрите возможность обновления или переустановки Bash на Ubuntu 24.10 для устранения возможных багов в версии 5.2.32.
Заключение
Ошибка формата -nan
в выводе printf
на Ubuntu 24.10 может быть вызвана рядом факторов, включая изменения в версии Bash и различиями в локалях. Рекомендуется использовать /bin/printf
, чтобы избежать подобных проблем, и проверить переменные среды на обоих системах для обеспечения однородности в выводах. Если ситуация не разрешится, рекомендуется обратиться к сообществу разработчиков для получения дополнительной информации о данной версии Bash и возможных багов.