Если ваш сокет относится к семейству адресов AF _INET, то это tcp4
вnetstat
netstat: tcp4 0 0 *.57312 *.* LISTEN
Если ваш сокет относится к семейству адресов AF _INET6, то это зависит от IPV6_V6ONLY
опции:
int v6only= 0;
setsockopt (s, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof ipv6only);
netstat: tcp 0 0 *.57313 *.* LISTEN
, если этот параметр установлен
int v6only= 1;
setsockopt (s, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof ipv6only);
netstat: tcp6 0 0 *.57314 *.* LISTEN
the_id='cover'
the_mediatype_prefix='image/'
xmlstarlet sel -t \
--var queryid="'$the_id'" \
--var typeprefix="'$the_mediatype_prefix'" \
-v '//item[@id = $queryid and starts-with(@media-type, $typeprefix)]/@href' \
-nl file.xml
Это запрашивает файл XML, используя две переменные оболочки. Переменная the_id
содержит значение атрибута id
, с которым мы фильтруем, а the_mediatype_prefix
содержит строку, с которой должен начинаться атрибут media-type
.
Мы создаем две внутренние переменные для xmlstarlet
, используя опцию инструмента --var
. Значения должны быть закодированными значениями, поэтому я заключаю их в одинарные кавычки (это немного хак, в идеале они должны быть правильно закодированными строками XPath, но это немного лучше, чем вставлять переменные оболочки непосредственно в выражение ).
Выражение XPath выбирает атрибут href
каждого узла item
, который имеет соответствие id
и media-type
.
Использованиеxq
(XML-оболочки синтаксического анализатора вокруг jq
вместо этого синтаксического анализатора JSON ):
the_id='cover'
the_mediatype_prefix='image/'
xq -r \
--arg queryid "$the_id" \
--arg typeprefix "$the_mediatype_prefix" '
.. |.item? |
select(
."@id" == $queryid and
(."@media-type" | startswith($typeprefix))
)."@href"' file.xml
Это более или менее идентично коду xmlstarlet
, за исключением использования выражения jq
вместо запроса XPath. Здесь утилита позаботится о правильном кодировании ваших переменных оболочки, даже если они содержат неверные значения, такие как кавычки и т. д. (значения переменных оболочки в примере xmlstarlet
должны быть закодированы вручную, если они содержат недопустимые последовательности символов ). ].
Вы можете добавить несколько условий:
xmlstarlet sel -t -m "//item[@id='cover'][starts-with(@media-type,'image/')]" -v '@href' -nl file.xml