De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Julio Cezar Neves
Data de Publicação: 12 de dezembro de 2022
Existe um comando, cuja função primordial é construir listas de parâmetros
e passá-la para a execução de outros programas ou instruções. Este comando
é o xargs e deve ser usado com a seguinte sintaxe:
xargs [CMD [ARGINI]]
O xargs combina o argumento inicial ARGINI de CMD, com os
argumentos recebidos da entrada padrão, de forma a executar o comando CMD
uma ou mais vezes.
O xargs tem 2 características:
CMD com o maior número de parâmetros
possível.
Exemplo
Repare na sequência de comandos a seguir que o comando rm não aceita,
por segurança, dados oriundos entrada primária e que ele deve pedir uma
confirmação antes de remover um arquivo:
$ ls arq # Arquivo existe arq $ alias rm='rm -i' # Para pedir confirmação anter de remover $ rm arq rm: remover arquivo comum vazio ?arq?? n $ ls arq | rm # rm não aceita dados da entrada primária rm: falta operando Try 'rm --help' for more information. $ ls arq | xargs rm && echo removido removido
No último comando, vimos que o arquivo foi removido sem pedir confirmação. Isso
foi em virtude da 1a característica descrita, isto é, o alias era do Shell, mas
o xargs passou o comando para execução sem que o Shell se metesse na encrenca.
Um outro exemplo para demonstrar a 2a característica que foi descrita, que ele sempre tenta passar a maior quantidade de parâmetros possíveis:
$ seq 5 1 2 3 4 5 $ seq 5 | xargs 1 2 3 4 5
Como você viu, com o uso do xargs ele mandou o maior número de parâmetros
possíveis para o comando, que por padrão tinha um echo implícito.
O xargs recebe os dados por qualquer entrada primária e não somente via pipe.
Exemplo:
Para criar o diretório dir1 e dir2 podemos fazer:
$ xargs mkdir <<< "dir1 dir2"
Ou:
$ cat direts
dir1
dir2
$ xargs mkdir < direts
Ou até:
$ < direts xargs mkdir
Esse comando tem diversas utilidades que mostrarei muito rapidamente para poder me alongar na última.
Esta opção recebe uma quantidade INT de parâmetros de cada vez:
Exemplo
$ echo {1..3} # Isto é uma Expansão de Chaves
1 2 3
$ echo {1..3} | xargs -n1 echo Linha
Linha 1
Linha 2
Linha 3
Nesse caso o xargs pegou os parâmetros de entrada um a um (-n1) e colocou-os
após o ARGINI (Linha) do comando echo.
Outro exemplo desta vez vou criar duas colunas, uma só com números ímpares e outra só com pares:
$ echo {1..6} | xargs -n2 # O comando default é o echo
1 2
3 4
5 6