Rõ ràng nó có thể được thực hiện đơn giản hơn với udevadm, và tôi đã tìm ra cách.
Để có được DEVNAMEtừ udevadmbạn chỉ cần làm:
udevadm info -rq name $PATH
Chẳng hạn, nếu bạn muốn biết /devtên cho /sys/dev/char/5:1bạn:
udevadm info -rq name /sys/dev/char/5:1
ĐẦU RA
/dev/console
Các -rtùy chọn là để xác định một --rootcon đường ed - mà không có nó kết quả trên sẽ chỉ đọc console. Các -qtùy chọn chỉ định một cơ sở dữ liệu --queryvà phải mất các toán hạng nameở đây - bởi vì chúng tôi muốn DEVNAME.
Một phương tiện rất đơn giản để tìm đường dẫn đến thiết bị char và / hoặc khối chỉ được cung cấp chính: số phụ có thể trông như sau:
mmdev() for d in /sys/dev/[cb]*/$1:$2
do [ -e "$d" ] || return
printf %c:%s: "${d#/*/*/}" "${d##*/}"
udevadm info -rq name "$d"
done
Vì vậy, chạy:
mmdev 8 0
in ...
b:8:0:/dev/sda
Đây là bài đầu tiên tôi viết.
majminpath() {
set -- ${1##*[!0-9]*} ${2##*[!0-9]*}
udevadm info --export-db |
sed 's|^[^=]*DEVNAME=||
\|^[^/]|!h;/MAJOR=/N
\|='"$1\n.*=${2?}"'$|!d;g'
}
Điều này chỉ quét udevadm info --export-dbđầu ra cho các số phù hợp. Đầu ra trông như sau:
P: /devices/virtual/vc/vcsa4
N: vcsa4
E: DEVNAME=/dev/vcsa4
E: DEVPATH=/devices/virtual/vc/vcsa4
E: MAJOR=7
E: MINOR=132
E: SUBSYSTEM=vc
P: /devices/virtual/vc/vcsa5
N: vcsa5
E: DEVNAME=/dev/vcsa5
E: DEVPATH=/devices/virtual/vc/vcsa5
E: MAJOR=7
E: MINOR=133
E: SUBSYSTEM=vc
#...and so on
Quy trình công việc giống như:
cố gắng tước [^=]*DEVNAME=chuỗi từ đầu của mỗi dòng
nếu một dòng không có ký tự đầu tiên hoặc ký tự đầu tiên của nó được /sao chép dòng đó trên hkhông gian cũ
nếu một dòng khớp với MAJOR=nối thêm Ndòng đầu vào ext vào không gian mẫu
nếu có 2 dòng trong không gian mẫu khớp với nhau =$1\n.*=$2$thì sao chép hkhông gian cũ trên không gian mẫu và tự động in; khác xóa không gian mẫu
Vì vậy, nếu tôi làm:
majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1
ĐẦU RA
/dev/vcsa5
/dev/sda
/dev/sda1
Nhưng, như @xae chỉ ra, các thiết bị kiểu khối / char có thể chia sẻ các kết hợp chính: tối thiểu và do đó, điều này có thể có thể in nhiều hơn một đường dẫn cho mỗi cuộc gọi.