Відповіді:
Команда system_profiler надає пряму відповідь, яку легко зрозуміти людині (якщо припустити, що ви перебуваєте на 10.3 або новішій версії), але ви можете також використовувати ioreg для завдання, оскільки воно, як правило, швидше завершується.
system_profiler SPHardwareDataType
- це тип даних, який містить основну технічну інформацію про обладнання, і ви можете використовувати grep або awk, щоб запакувати речі далі за необхідності:
system_profiler SPHardwareDataType | awk '/Serial/ {print $4}'
або
ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'
Обидві ці команди займають від 0,5 до 0,2 секунд для запуску на сучасних SSD Macs, тому, якщо ви хочете оптимізувати команду та видалити ", ви можете отримати свою відповідь за 0,005s або так:
ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'
Це також працює ...
ioreg -l | grep IOPlatformSerialNumber
awk
версія, щоб викреслити 600 ліній ioreg
виводу, які ми не хочемо бачити. (також - не заперечуйте тих, хто
Щоб полегшити запам’ятовування, використовуйте нечутливий до регістру пошук:
ioreg -l | grep -i serialnumber | grep -i platform
Приклад C ++:
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
std::string
getSerialNumber()
{
CFStringRef serial;
char buffer[32] = {0};
std::string seriaNumber;
io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("IOPlatformExpertDevice"));
if (platformExpert)
{
CFTypeRef serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert,
CFSTR(kIOPlatformSerialNumberKey),
kCFAllocatorDefault, 0);
if (serialNumberAsCFString) {
serial = (CFStringRef)serialNumberAsCFString;
}
if (CFStringGetCString(serial, buffer, 32, kCFStringEncodingUTF8)) {
seriaNumber = buffer;
}
IOObjectRelease(platformExpert);
}
return seriaNumber;
}
ioreg
моєму MBPR цей момент майже зараз.system_profiler
хоча швидше на цьому mac, ніж у моїх старших, набагато повільніше.