Почему команда uname в archlinux выглядит так?
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
но это имеет совершенно другое значение там).