Como eu canalizo uma lista separada por nova linha como argumentos para outro comando?

6

Portanto, tenho uma lista de nomes de usuários, como:

user1
user2
user3

Eu quero aplicar id em cada um deles e obter algo como:

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

Como posso conseguir isso? Por favor, note que a lista é a saída de outro comando, digamos mycommand .

    
por yukashima huksay 18.12.2017 / 09:17

2 respostas

15

Use xargs :

mycommand | xargs -L1 id

Exemplo:

$ (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)

Você também pode percorrer a entrada no bash:

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

xargs converte a entrada em argumentos de um comando. A opção -L1 diz a xargs para usar cada linha como um único argumento para uma invocação do comando.

    
por Olorin 18.12.2017 / 09:23
4

Com o bash, você pode capturar as linhas de saída em uma matriz:

mapfile -t lines < <(mycommand)

E depois iterar sobre eles

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

Isso não é tão conciso quanto xargs, mas se você precisar de mais de uma linha para as linhas, é bastante útil.

    
por glenn jackman 18.12.2017 / 12:31