Большую часть этой информации можно получить из/sys
:
1а./sys/class/net/
:список сетевых устройств, включая все типы
1б./sys/devices/virtual/net/
:список виртуальных сетевых устройств :включает lo
, туннели, veth, мосты... поэтому, если это первое, а не это, оно должно быть физическим.
если устройство является драйвером )современного беспроводного устройства (, оно будет иметь запись /sys/class/net/<device>/phy82011/name
, например:
$ grep -s --with-filename '' /sys/class/net/*/phy80211/name
/sys/class/net/wlan0/phy80211/name:phy0
/sys/class/net/wlan1/phy80211/name:phy1
/sys/class/net/wlan2/phy80211/name:phy2
Таким образом, запустив соответствующий скрипт из среды udev
и сравнив с этими каталогами и файлами из /sys
, вы получите всю необходимую информацию для этого.
В качестве примечания:если позже для работы на этих устройствах вы измените только сеть пространство имен (, например, с использованием nsenter --net=/var/run/netns/physical
), /sys
по-прежнему будет находиться в пространстве имен хоста mount , и не будет отражать появление этих устройств, а будет показывать их отсутствие. Использование ip netns exec physical command
нормально, оно изменяет пространство имен монтирования и перемонтирует /sys
для вас.
xargs -r cmd
пропускает выполнение cmd
без аргументов.
С помощью -0
создается один аргумент для каждой записи с разделителями NUL -на входе
printf '\0' | xargs -r0 cmd
Вы загружаете одну пустую запись, поэтому cmd
вызывается с одним пустым аргументом (и с printf '\0\0'
, это будут 2 пустые записи и т. д. ).
С:
printf '' | xargs -r0 cmd
Вы не передаете записи, поэтому cmd
не выполняется.
С:
printf '' | xargs -0 cmd
Вы по-прежнему не передаете ни одной записи, но поскольку -r
не предоставлено, cmd
по-прежнему вызывается один раз без аргументов.
Без -0
xargs
ожидает очень специальный формат ввода, это не простой список с разделителями, как с xargs -0
илиxargs -d '\n'
Чтобы передать один пустой аргумент, вам нужно что-то вроде:
printf '""\n' | xargs -r cmd
printf "''\n" | xargs -r cmd
или если на то пошло:
printf '\n\n \t\t "" \n\n \t\n' | xargs -r cmd
printf -- '-%s\n'
— не лучший выбор команды для проверки, так как она дает тот же результат при отсутствии аргумента, что и при передаче одного пустого аргумента.
Можно было бы и получше:
$ printf '\n\n \t\t "" \n\n \t\n' | xargs -r zsh -c 'PS4=Got; set -x; : "$@"' zsh
Got: ''
$ printf '\n\n \t\t \n\n \t\n' | xargs zsh -c 'PS4=Got; set -x; : "$@"' zsh
Got:
$ printf '\t\n\n' | xargs -rd '\n' zsh -c 'PS4=Got; set -x; : "$@"' zsh
Got: $'\t' ''
Или:
$ printf '\t\n\0\0' | xargs -0 zsh -c 'print -rl $#: " - ${(q+)^@}"' zsh
2:
- $'\t\n'
- ''