Почему `-r `по-видимому игнорируется при использовании с `-0 `в GNU xargs?

Большую часть этой информации можно получить из/sys:

1а./sys/class/net/:список сетевых устройств, включая все типы

1б./sys/devices/virtual/net/:список виртуальных сетевых устройств :включает lo, туннели, veth, мосты... поэтому, если это первое, а не это, оно должно быть физическим.

  1. если устройство является драйвером )современного беспроводного устройства (, оно будет иметь запись /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для вас.

5
27.07.2020, 15:21
1 ответ

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по-прежнему вызывается один раз без аргументов.

Без -0xargsожидает очень специальный формат ввода, это не простой список с разделителями, как с 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'
 - ''
7
18.03.2021, 23:16

Теги

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