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.


O polivalente xargs - Parte 1

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:

  1. Quem passa os comandos para execução é ele e não o Shell. Por isso ele tem controle do ambiente e sabe exatamente quantos parâmetros pode passar sem haver estouro de pilha (Too many arguments);

  2. Ele sempre tentará executar o comando 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.

A opção -n INT

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

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Julio Cezar Neves