Почему команда uname в archlinux выглядит так?

Когда я ввожу gcc -vпросто показывает то же самое...

Я попробовал это в Debian, и он ведет себя нормально..

Я только встречаю эту проблему в арке и как я могу это исправить

1 ответ

uname -i не является переносимым в соответствии с man uname и это может быть скомпилировано. Мой новый Debian 8 также печатает его как

$ uname -i
unknown

uname является частью ядра GNU Coreutils, и это очень простая программа. Вы можете увидеть код на саванне. Если вы посмотрите через параметр командной строки там --hardware-platform является -i:

  88 static struct option const uname_long_options[] =
  89 {
  90   {"all", no_argument, NULL, 'a'},
  ...
  97   {"machine", no_argument, NULL, 'm'},
  98   {"processor", no_argument, NULL, 'p'},
  99   {"hardware-platform", no_argument, NULL, 'i'},
 100   {"operating-system", no_argument, NULL, 'o'},
 101   {GETOPT_HELP_OPTION_DECL},
 102   {GETOPT_VERSION_OPTION_DECL},
 103   {NULL, 0, NULL, 0}
 104 };

Что заставляет печатать определения PRINT_HARDWARE_PLATFORM

 198       while ((c = getopt_long (argc, argv, "asnrvmpio",
 199                                uname_long_options, NULL)) != -1)
 200         {
 201           switch (c)
 202             {
 ...
 227             case 'p':
 228               toprint |= PRINT_PROCESSOR;
 229               break;
 230 
 231             case 'i':
 232               toprint |= PRINT_HARDWARE_PLATFORM;
 233               break;

Что, в свою очередь, делает печать "неизвестной" по умолчанию.

 344   if (toprint & PRINT_HARDWARE_PLATFORM)
 345     {
 346       char const *element = unknown;
 347 #if HAVE_SYSINFO && defined SI_PLATFORM
 348       {
 349         static char hardware_platform[257];
 350         if (0 <= sysinfo (SI_PLATFORM,
 351                           hardware_platform, sizeof hardware_platform))
 352           element = hardware_platform;
 353       }
 354 #endif

Если я не ошибаюсь (я мог бы быть) HAVE_SYSINFO должен быть в sys/systeminfo.hи этот файл по умолчанию отсутствует в arch, Это не обязательно означает, что его не было там, когда был скомпилирован пакет. Тем не менее, это показывает, что, скорее всего, упаковщик не потрудился скомпилировать пакет с HAVE_SYSINFO правильно настроен. Что является приемлемым, поскольку это непереносимый вариант.


Смотрите мой комментарий о gcc -vмоя арка оценивает это правильно Target: x86_64-pc-linux-gnu, Но это не имеет ничего общего с uname, uname отправляет системные вызовы для распечатки информации о системе, gcc имеет цель, скомпилированную в нее.


Примечание: говоря это uname это часть coreutils не на 100% правильно. uname является частью стандарта POSIX, но -i (--hardware-platform) вариант uname не является частью этой спецификации. -i реализуется только coreutils пакет (черт возьми, *BSD системы имеют -i но это имеет совершенно другое значение там).

Другие вопросы по тегам