Как добавить аргументы к выполняемой команде xargs? (например, команда host)

Можно (POSIXly):

if { cmd 2>&1 >&3 3>&- | grep '^' >&2; } 3>&1; then
  echo there was some output on stderr
fi

Или сохранить исходный статус выхода, если он не был -нулевым:

fail_if_stderr() (
  rc=$({
    ("$@" 2>&1 >&3 3>&- 4>&-; echo "$?" >&4) |
    grep '^' >&2 3>&- 4>&-
  } 4>&1)
  err=$?
  [ "$rc" -eq 0 ] || exit "$rc"
  [ "$err" -ne 0 ] || exit 125
) 3>&1

Использование кода выхода 125для случаев, когда команда возвращается со статусом выхода 0, но выдает некоторую ошибку.

Используется как:

fail_if_stderr cmd its args || echo "Failed with $?"
0
27.09.2019, 18:42
2 ответа

Укажите replace-strс опцией -Iна xargs, и замена будет выполняться в любом месте команды, а не просто доводить аргумент до конца.

$ echo -e "google.com\nfarrellit.net\nexample.com" | xargs -I % -n 1 host % 8.8.8.8

У меня отлично работает в bash/osx:

Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases:

google.com has address 172.217.9.46
google.com has IPv6 address 2607:f8b0:4009:802::200e
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases:

farrellit.net has address 99.84.254.112
farrellit.net has address 99.84.254.4
farrellit.net has address 99.84.254.33
farrellit.net has address 99.84.254.62
farrellit.net mail is handled by 10 mail3.farrellit.net.
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases:

example.com has address 93.184.216.34
example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
example.com mail is handled by 0.
1
28.01.2020, 02:39

Обычно причина, по которой вы хотите указать, какой сервер имен запрашивать, заключается в том, что вы хотите запрашивать несколько разных серверов имен.

Используя GNU Parallel, вы можете сделать:

parallel host {1} {2} :::: hostlist.txt ::: 8.8.8.8 1.1.1.1

Для просмотра результатов используйте--tag:

parallel --tag host {1} {2} :::: hostlist.txt ::: 8.8.8.8 1.1.1.1

Часто ваш список хостов довольно велик, и, добавив -j100, вы можете параллельно разрешить 100 хостов.

0
28.01.2020, 02:39

Теги

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