[uanog] Help with xargs substring, please

George L. Yermulnik yz at yz.kiev.ua
Thu Feb 11 13:13:13 EET 2021


Hello!

On Thu, 11 Feb 2021 at 10:16:50 (+0200), Oleh Hrynchuk wrote:

> Маю ось результат виконання команди:

> oleh at localhost:~$ curl -sSL "https://localhost:5000/v2/_catalog" | jq -r
> '.repositories[]' | xargs -n1 -I {} bash -c 'echo "$@"' _ {}
> etx/for_audit
[...]
> oleh at localhost:~$

Было бы удобнее увидеть выхлоп jq без последующего xargs, т.к. мне
сильно кажется, что аргументы к xargs можно было бы минимизировать до
простого "xargs -n1".

> І не можу розібратися ДЕТАЛЬНО що робить наступний pipe цієї команда:

> xargs -n1 -I {} bash -c 'echo "$@"' _ {}

> Тобто, я по одному (xargs -n1) беру аргументи з STDOUT попереднього pipe
> і.... і що далі?

и по одному подставляем вместо {} в конец.

> Також який зміст несуть два кінцеві елементи:   _  {} ?

По порядку:
-n1 -> брать по одному аргументу из stdin
-I {} -> "запоминать" аргумент для многоразового использования (по умолчанию до 5 раз)
bash -c 'echo "$@"' _ {} -> команда, которой аргумент передать
	{} -> заменяется на тот самый аргумент, который "запомнили"
	_  -> в данном контексте аля blank identifier в golang

В целом команда выглядит, мягко говоря, переусложнённой.
Всё, что она делает - это передаёт bash'у массив в виде одного
аргумента, чтобы тот выполнил echo это массива. В текущем контексте, "_"
можно считать плейсхолдером для опускания ненужного элемента, т.к.
позиционные параметры в $@ (как и в $*) отсчитываются от первого, а не
нулевого (нулевой - это который имя шелл-скрипта -> $0).

Наглядный пример:
$ bash -c 'echo "$0: $@"' i-am-the-zero-param 0 1 2 3
i-am-the-zero-param: 0 1 2 3

$ bash -c 'echo "$0: $@"' 0 1 2 3
0: 1 2 3

Т.е. по сути выполняется "xargs -n1", в котором echo выполняется по
умолчанию, если команда не указана явно, и так же по умолчанию
аргумент(ы) из stdin дописываются в конец выполняемой команды.

Может, конечно, есть какая-то скрытая логика в переусложнении, но я её
не увидел, так что всю конструкцию "-I {} bash -c 'echo "$@"' _ {}"
можно смело купировать, оставив только "xargs -n1"

-- 
George L. Yermulnik
[YZ-RIPE]


More information about the uanog mailing list