Как передать разделенный строкой список в качестве аргументов другой команде?

Итак, у меня есть список имен пользователей, таких как:

user1
user2
user3

Я хочу применить id к каждому из них и получить что-то вроде:

uid=100(user1) gid=5(g1) groups=5(g1),6(g6),7(g10)
.
.

Как я могу достичь этого? Обратите внимание, что список является результатом другой команды скажем mycommand.

8
задан 18 December 2017 в 14:02

2 ответа

Используйте xargs :

mycommand | xargs -L1 id

Пример:

$ (echo root; echo nobody) | xargs -L1 id
uid=0(root) gid=0(root) groups=0(root)
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)

Вы также можете зациклить ввод в bash:

mycommand | while read line
do
    id "$line"
done

xargs преобразует входные данные в аргументы команды. Опция -L1 говорит xargs использовать каждую строку в качестве единственного аргумента для вызова команды.

15
ответ дан 18 December 2017 в 14:02

С помощью bash вы можете записать строки вывода в массив:

mapfile -t lines < <(mycommand)

, а затем перебрать их

for line in "${lines[@]}"; do
    id "$line"
done

Это не так кратко, как xargs, но если вам нужны строки для более чем одной вещи, это довольно полезно.

3
ответ дан 18 December 2017 в 14:02

Другие вопросы по тегам:

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