我是Mac OSX世界的新手,我必須編寫一個腳本,該腳本提供了連接的USB設備的供應商ID和產品ID。我已經完成了Windows和Linux,但對於Mac我不知道從哪裏開始。Mac OSX獲取USB供應商ID和產品ID
我看到這個post,但與示例的鏈接不起作用。你們有什麼建議可以從哪裏開始,或者我可以在哪裏找到一些例子?
特別是,我應該使用哪種語言?
我是Mac OSX世界的新手,我必須編寫一個腳本,該腳本提供了連接的USB設備的供應商ID和產品ID。我已經完成了Windows和Linux,但對於Mac我不知道從哪裏開始。Mac OSX獲取USB供應商ID和產品ID
我看到這個post,但與示例的鏈接不起作用。你們有什麼建議可以從哪裏開始,或者我可以在哪裏找到一些例子?
特別是,我應該使用哪種語言?
你用bash
標記了你的問題,所以我會回答它,就好像你問如何在bash中這樣做,而不是問什麼語言使用(這將使問題脫離StackOverflow)。
您可以使用內置工具從system_profiler解析現有數據。例如,這裏的供應商的轉儲:產品對,「位置ID」和製造商...
#!/bin/bash
shopt -s extglob
while IFS=: read key value; do
key="${key##+()}"
value="${value##+()}"
case "$key" in
"Product ID")
p="${value% *}"
;;
"Vendor ID")
v="${value%% *}"
;;
"Manufacturer")
m="${value}"
;;
"Location ID")
l="${value}"
printf "%s:%s %s (%s)\n" "$v" "$p" "$l" "$m"
;;
esac
done < <(system_profiler SPUSBDataType)
這依賴於一個事實,即Location ID
是每個USB設備中列出的最後一個項目,這是我的天堂」沒有確鑿的證實。 (這對我來說就是這樣。)
如果您想要(1)更易於閱讀和(2)不依賴bash並因此更具可移植性(儘管不是問題;所有Mac都帶有bash),您可能需要考慮在awk中,而不是純粹的bash做你的繁重:
#!/bin/sh
system_profiler SPUSBDataType \
| awk '
/Product ID:/{p=$3}
/Vendor ID:/{v=$3}
/Manufacturer:/{sub(/.*: /,""); m=$0}
/Location ID:/{sub(/.*: /,""); printf("%s:%s %s (%s)\n", v, p, $0, m);}
'
甚至避免在外殼採用完全包裹這樣的:
#!/usr/bin/awk -f
BEGIN {
while ("system_profiler SPUSBDataType" | getline) {
if (/Product ID:/) {p=$3}
if (/Vendor ID:/) {v=$3}
if (/Manufacturer:/) {sub(/.*: /,""); m=$0}
if (/Location ID:/) {sub(/.*: /,""); printf("%s:%s %s (%s)\n", v, p, $0, m)}
}
}
請注意,您也可以以XML格式得到system_profiler
輸出:
$ system_profiler -xml SPUSBDataType
不過,您需要一個XML解析器來處理輸出。而且你會發現在本地bash中解析XML有很多工作要做。
根據你想要處理的信息,你可以在System Information
查找它。
點擊Apple
菜單屏幕,About this Mac
,More Info
,System Report
的左上角和選擇Hardware
在左上角,然後USB
。
你也許可以寫Applescript來做到這一點,但是如果你打算繼續以某種方式與設備進行交互,這可能不是最好的方法。
我需要一個腳本,給定一個USB路徑,返回設備的供應商ID和產品ID。我需要獨立的信息(我不需要與設備進行交互)。 – Sceik
可以使用system_profiler命令,就像這樣:
system_profiler -detailLevel full
,並從解析outout。或者,您可以將-xml選項添加到system_profiler命令中,並使用awk/grep或Perl中的XML模塊輕鬆解析XML。
例提取物:
| | | | +-o FaceTime HD Camera (Built-in)@0 <class IOUSBInterface, id 0x1000002b2, registered, matched, active, busy 0 (26 ms), retain 7>
| | | | | {
| | | | | "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
| | | | | "bcdDevice" = 0x755
| | | | | "IOUserClientClass" = "IOUSBInterfaceUserClientV3"
| | | | | "idProduct" = 0x850b
| | | | | "bConfigurationValue" = 0x1
| | | | | "bInterfaceSubClass" = 0x1
| | | | | "locationID" = 0xfffffffffa200000
| | | | | "USB Interface Name" = "FaceTime HD Camera (Built-in)"
| | | | | "idVendor" = 0x5ac
關於路徑USB設備,我不知道你會怎麼做,只是在Mac上。我可能會嘗試運行:
find /dev -type b -o -type c
插入USB設備,並保存在輸出之前。然後讓用戶插入設備並再次運行相同的命令,以查看插入設備後添加了哪些設備專用文件。也許粗魯,也許有效 - 只是一個想法。
你使用什麼語言的Linux等我會認爲C將是一個很好的起點。基於Linux/OSX Unix根 – BillyBigPotatoes
我使用C for Linux和C++ for Windows,但我也可以使用任何其他語言。 – Sceik