Может ли Zargs работать под псевдонимами?

Чтобы получить эту информацию из sysfs для файла устройства, сначала определите старший / младший номер, посмотрев на вывод ls -l , например

 $ ls -l /dev/sda
 brw-rw---- 1 root disk 8, 0 Apr 17 12:26 /dev/sda

] 8, 0 сообщает нам, что старшее число - 8 , а младшее - 0 . b в начале листинга также говорит нам, что это блочное устройство. Другие устройства могут иметь в начале c для символьного устройства.

Если вы затем посмотрите в / sys / dev , вы увидите, что там два каталога. Один называется блоком , а другой - char . Здесь нетрудно понять, что они предназначены для блочных и символьных устройств соответственно. Каждое устройство становится доступным по его старшему / младшему номеру в этом каталоге. Если для устройства доступен драйвер, его можно найти, прочитав цель ссылки драйвер в этом подкаталоге или в подкаталоге устройства . Например, для моего / dev / sda я могу просто сделать:

$ readlink /sys/dev/block/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd

Это показывает, что для устройства используется драйвер sd . Если вы не уверены, является ли устройство блочным или символьным устройством, в оболочке вы можете просто заменить эту часть на * . Это работает так же хорошо:

$ readlink /sys/dev/*/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd

Блочные устройства также могут быть доступны напрямую через их имя через / sys / block или / sys / class / block . Например:

$ readlink /sys/block/sda/device/driver
../../../../../../../bus/scsi/drivers/sd

Обратите внимание, что существование различных каталогов в / sys может изменяться в зависимости от конфигурации ядра. Также не все устройства имеют подпапку устройство .Например, это относится к файлам устройств разделов, таких как / dev / sda1 . Здесь вам нужно получить доступ к устройству для всего диска (к сожалению, для этого нет ссылок sys ).

И последнее, что может быть полезно сделать, это перечислить драйверы для всех устройств, для которых они доступны. Для этого вы можете использовать глобусы, чтобы выбрать все каталоги, в которых есть ссылки на драйверы. Например:

$ ls -l /sys/dev/*/*/device/driver ls -l /sys/dev/*/*/driver 
ls: cannot access ls: No such file or directory
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/block/11:0/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:16/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:32/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:0/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:1024/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:128/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:256/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:384/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:512/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:513/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:514/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:640/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:643/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:768/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:896/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:1/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/char/21:2/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:3/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:0/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:1/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:2/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:1/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/char/252:2/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:3/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/254:0/device/driver -> ../../../bus/pnp/drivers/rtc_cmos
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/29:0/device/driver -> ../../../bus/platform/drivers/simple-framebuffer
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:64/device/driver -> ../../../bus/pnp/drivers/serial
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:65/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:66/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:67/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/6:0/device/driver -> ../../../bus/pnp/drivers/parport_pc
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/99:0/device/driver -> ../../../bus/pnp/drivers/parport_pc

Наконец, чтобы немного отклониться от вопроса, я добавлю еще один трюк с глобусом / sys , чтобы получить гораздо более широкое представление о том, какие драйверы используются какими устройствами (хотя и не обязательно с теми, у которых есть файл устройства):

find /sys/bus/*/drivers/* -maxdepth 1 -lname '*devices*' -ls

Обновление

При более внимательном рассмотрении вывода udevadm , похоже, он работает, находя канонический каталог / sys (как если бы вы разыменовали вышеупомянутые главные / второстепенные каталоги), затем продвигались вверх по дереву каталогов, распечатывая любую найденную информацию. Таким образом вы получите информацию о родительских устройствах и любых драйверах, которые они используют.

Чтобы поэкспериментировать с этим, я написал приведенный ниже скрипт для просмотра дерева каталогов и отображения информации на каждом соответствующем уровне. udev , похоже, ищет файлы для чтения на каждом уровне, их имена и содержимое включены в ATTRS . Вместо этого я отображаю содержимое файлов uevent на каждом уровне (по-видимому, его наличие определяет отдельный уровень, а не просто подкаталог).Я также показываю базовое имя любых ссылок подсистем, которые я нахожу, и это показывает, как устройство вписывается в эту иерархию. udevadm не отображает ту же информацию, так что это хороший дополнительный инструмент. Информация о родительском устройстве (например, информация PCI ) также полезна, если вы хотите сопоставить вывод других инструментов, таких как lshw , с устройствами более высокого уровня.

#!/bin/bash

dev=$(readlink -m $1)

# test for block/character device
if [ -b "$dev" ]; then
  mode=block
elif [ -c "$dev" ]; then
  mode=char
else
  echo "$dev is not a device file" >&2
  exit 1
fi

# stat outputs major/minor in hex, convert to decimal
data=( $(stat -c '%t %T' $dev) ) || exit 2
major=$(( 0x${data[0]} ))
minor=$(( 0x${data[1]} ))

echo -e "Given device:     $1"
echo -e "Canonical device: $dev"
echo -e "Major: $major"
echo -e "Minor: $minor\n"

# sometimes nodes have been created for devices that are not present
dir=$(readlink -f /sys/dev/$mode/$major\:$minor)
if ! [ -e "$dir" ]; then
  echo "No /sys entry for $dev" >&2
  exit 3
fi

# walk up the /sys hierarchy one directory at a time
# stop when there are three levels left 
while [[ $dir == /*/*/* ]]; do

  # it seems the directory is only of interest if there is a 'uevent' file
  if [ -e "$dir/uevent" ]; then
    echo "$dir:"
    echo "  Uevent:"
    sed 's/^/    /' "$dir/uevent"

    # check for subsystem link
    if [ -d "$dir/subsystem" ]; then
        subsystem=$(readlink -f "$dir/subsystem")
        echo -e "\n  Subsystem:\n    ${subsystem##*/}"
    fi

    echo
  fi

  # strip a subdirectory
  dir=${dir%/*}
done
4
02.12.2018, 15:13
1 ответ

Псевдонимы — это cshфункция бедняка. Псевдонимы на самом деле не являются командами, это скорее текстовые замены. aliases используются в более продвинутых оболочках, у которых есть функции, в качестве хакерских инструментов для случаев, когда функции нельзя использовать, например, в таких вещах, как:

alias forever='while true; do'

Или

alias fail='{ echo >&2 FAIL; return 1; }'

Что не работает с функциями. Но здесь, это не один из тех случаев.

alias pi='pip install -U'

Не определяетpiкоманду , он определяетpiпсевдоним . Здесь, как это бывает, при расширении это превращается в начало простой команды, но псевдонимы не раскрываются во всех случаях, когда ожидается команда. В частности, они не раскрываются внутри таких функций, как zargsздесь (ну, они есть, но во время определения функции , а не вызова, это были наши foreverили failвышеприведенные псевдонимы могут быть полезны ). И они расширяются в некоторых контекстах, где это неуместно (, как вpi() {...; }).

Глобальный псевдоним не является решением, глобальные псевдонимы по-прежнему не являются командами, они по-прежнему будут подстановкой текста, но расширены в еще большем количестве случаев.

После

alias -g pi='pip install -U'

Теперь piслово расширяется везде, где оно встречается. Так, например, echo piвыведет pip install -U.

Здесь, если вы хотите определить команду pi, вы должны использовать функцию:

pi() pip install -U "$@"

Этот вызов будет вызван zargs.

С вашимpiпростым псевдонимом вы все еще можете:

zargs ~/scripts/python/**/requirements.txt -- ${=aliases[pi]} -r

То есть вызвать$IFS-расщепление определения псевдонима. Или пойти немного дальше:

zargs ~/scripts/python/**/requirements.txt -- "${(@Q)${(ze)aliases[pi]}}" -r    

где zвыполняет разбиение с учетом цитирования (, поэтому, например, echo "foo bar"можно разделить на echoи "foo bar"вместо echo, "fooи bar"),eдля выполнения расширений (, таких как echo $(uname), расширенных до echo Linux, например ), Q, чтобы удалить кавычки, что дало бы лучшее приближение еще в нескольких случаях.

2
27.01.2020, 21:01

Теги

Похожие вопросы