Câu trả lời:
Lệnh system_profiler cung cấp một câu trả lời trực tiếp dễ đọc cho con người (giả sử bạn đang ở 10.3 hoặc mới hơn), nhưng bạn cũng có thể sử dụng ioreg cho nhiệm vụ vì nó thường hoàn thành nhanh hơn.
system_profiler SPHardwareDataType
là kiểu dữ liệu chứa thông tin phần cứng cốt lõi và bạn có thể sử dụng grep hoặc awk để giảm bớt mọi thứ khi cần:
system_profiler SPHardwareDataType | awk '/Serial/ {print $4}'
hoặc là
ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'
Cả hai lệnh này mất từ 0,5 đến 0,2 giây để chạy trên máy Mac SSD hiện đại, vì vậy nếu bạn muốn tối ưu hóa lệnh và xóa " bạn có thể có câu trả lời của mình sau 0,005 giây hoặc lâu hơn:
ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}'
Điều này cũng hoạt động
ioreg -l | grep IOPlatformSerialNumber
awk
phiên bản để loại bỏ 600 dòng ioreg
đầu ra mà chúng tôi không muốn thấy. (cũng - đừng bận tâm đến những người bỏ phiếu - một số người thực sự không thích câu trả lời ngắn hoặc quên rằng không phải ai cũng biết grep và awk hoạt động như thế nào.)
Để dễ nhớ hơn, hãy sử dụng tìm kiếm không phân biệt chữ hoa chữ thường:
ioreg -l | grep -i serialnumber | grep -i platform
Ví dụ về 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
cái gần như ngay lập tức trên MBPR của tôi.system_profiler
mặc dù nhanh hơn trên mac này so với máy cũ của tôi chậm hơn nhiều.