-x
resulta em xargs
a sair assim que processa um argumento que não se encaixa, sem tentar usar nenhum dos argumentos na linha que está a criar atualmente.
Você pode ver a diferença que faz com o seguinte comando:
(printf '%s ' {1..2048}; printf %s {1..1024}) | xargs -s 2048
Aqui, xargs
recebe os inteiros de 1 a 2048, cada um seguido por um espaço, depois todos os inteiros de 1 a 1024 sem separador. Ele executa echo
para gerar os argumentos, mantendo um limite de 2048 caracteres. Quando ele lê o último argumento, que não cabe em uma linha, xargs
exibe o erro "linha de argumento muito longa", mas ainda chama echo
com os argumentos acumulados antes de encontrar o último argumento, então você ainda vê todos os inteiros de 1 a 2048.
com -x
:
(printf '%s ' {1..2048}; printf %s {1..1024}) | xargs -s 2048 -x
pára em 1854, porque xargs
se depara com o argumento longo, está construindo a linha de argumento começando com 1855, e por causa da opção -x
, ele não tenta fazer nada com a linha de argumento que é atualmente edifício.
Não acredito que seja possível para xargs
executar um comando com êxito sem -x
e não com -x
. O argumento -x
apenas garante que, se uma linha de argumento for muito longa, nenhuma parte será processada.
Com ou sem -x
, xargs
não processa argumentos após o argumento de transbordamento.
(Agradecimentos a ilkkachu por apontar que minha versão anterior desta resposta estava errada.)