Görünüşe göre daha basit bir şekilde yapılabilir udevadmve nasıl olduğunu öğrendim.
Almak için DEVNAMEgelen udevadmsizin sadece yapmanız gereken:
udevadm info -rq name $PATH
Örneğin, /devadının /sys/dev/char/5:1ne olacağını bilmek isterseniz:
udevadm info -rq name /sys/dev/char/5:1
ÇIKTI
/dev/console
-rSeçenek belirtmektir --rootsadece okurdum yukarıda onsuz sonucu - ed yolunu console. -qSeçenek bir veritabanı belirtir --queryve işlenen alır nameburada - biz istediğimiz için DEVNAME.
Yalnızca büyük verilen bir karakter ve / veya blok cihazının yolunu bulmanın çok basit bir yolu: küçük sayılar şöyle görünebilir:
mmdev() for d in /sys/dev/[cb]*/$1:$2
do [ -e "$d" ] || return
printf %c:%s: "${d#/*/*/}" "${d##*/}"
udevadm info -rq name "$d"
done
Yani koşuyor:
mmdev 8 0
baskılar ...
b:8:0:/dev/sda
İşte ilk yazdığım.
majminpath() {
set -- ${1##*[!0-9]*} ${2##*[!0-9]*}
udevadm info --export-db |
sed 's|^[^=]*DEVNAME=||
\|^[^/]|!h;/MAJOR=/N
\|='"$1\n.*=${2?}"'$|!d;g'
}
Bu sadece udevadm info --export-dbeşleşen numaraların çıktısını tarar . Çıktı şöyle görünür:
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
İş akışı şöyledir:
[^=]*DEVNAME=dizeyi her satırın başından ayırmaya çalışın
bir satırın ilk karakteri yoksa veya ilk karakteri /o satırı heski alana kopyalarsa
bir çizgi eşleşirse desen alanına MAJOR=ek Ngiriş satırı ekler
desen alanında eşleşen 2 satır varsa eski alanı desen alanı üzerine =$1\n.*=$2$kopyalayın hve otomatik yazdırın; başka desen alanını sil
Yani ben yaparsam:
majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1
ÇIKTI
/dev/vcsa5
/dev/sda
/dev/sda1
Ancak, @xae'nin işaret ettiği gibi, blok / karakter tipi cihazlar maj: min kombinasyonlarını paylaşabilir ve bu nedenle arama başına birden fazla yol yazdırılabilir.