[uanog] Help with xargs substring, please

Oleh Hrynchuk oleh.hrynchuk at gmail.com
Thu Feb 11 15:38:22 EET 2021


Колеги, щиро всім дякую за консультації та поради.



чт, 11 лют. 2021 о 13:13 George L. Yermulnik <yz at yz.kiev.ua> пише:

> 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".
>
>
Вивід команди "без xargs" абсолютно тотожний з xargs.

Справа в тому, що в оригінальному скрипті замість 'echo' стоїть
доморощена функція `clear_repository` котра по одному чистить оті гілки
docker registry, що передаються їй.

Тепер бачу, що реально там все ускладнено.
Дякую іще раз.




> > І не можу розібратися ДЕТАЛЬНО що робить наступний 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]
> _______________________________________________
> uanog mailing list
> uanog at uanog.kiev.ua
> https://mailman.uanog.kiev.ua/mailman/listinfo/uanog



-- 
Regards,
/oleh hrynchuk
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.uanog.kiev.ua/pipermail/uanog/attachments/20210211/af55494a/attachment-0001.html>


More information about the uanog mailing list