Como repetir variáveis ​​duas vezes em xargs


21

Como posso fazer o segundo eco para ecoar o teste também neste exemplo:

 echo test  | xargs -I {} echo {} && echo {}
xargs 

var=test & echo $var ...
alexus

xargs -I {} var = {} echo $ var && echo $ var Isso daria a você: Esse arquivo ou diretório não existe.

Respostas:


27

Basta escrever {}duas vezes em seu comando. O seguinte funcionaria:

$ echo test | xargs -I {} echo {} {}
test test

Seu problema é como os comandos são aninhados . Vamos olhar para isso:

echo test | xargs -I {} echo {} && echo {}

o bash será executado echo test | xargs -I {} echo {}. Se executado com sucesso, echo {}é executado. Para alterar o aninhamento, você pode fazer algo assim:

echo test | xargs -I {} sh -c "echo {} && echo {}"

No entanto, você pode ter problemas porque a abordagem pode estar propensa a injeção de código. Quando "test" é substituído pelo código do shell, ele é executado. Portanto, você provavelmente deve passar a entrada para o shell aninhado com argumentos.

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}

3
Observe que você obterá resultados inesperados em seu último código se tiver um código de acesso, literalmente, $(rm -f *) ,. É melhor fazerxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda

@Kusalananda, obrigado. Eu estava ciente do problema, mas não consegui pensar em uma solução simples naquele momento. Integrei sua sugestão na resposta.
JojOatXGME

5

Outra opção é usar o -isinalizador, que é o mesmo que -I{}(implica que a substituição é fornecida com {}):

$ echo test | xargs -i echo {} {}

11
Enquanto isso: This option is deprecated; use -I instead.foi adicionado ao manual man xargs.
Jonathan Komar

0

Para mim, apenas as letras minúsculas funcionam. Eu tinha centenas de imagens em um diretório e queria colocá-las em uma lista. A -Iopção i maiúscula não funcionou para mim. Apenas a minúscula. Provavelmente devido a diferenças de versão. Todas essas imagens tinham nomes como Daniel_(somenumber).jpg.

Essa sintaxe funcionou:

ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"

Devoluções:

src='Daniel_248.jpg' alt='Daniel_248.jpg'
...

Linux ver 4.14.96-hw + # 80 SMP x86_64 GNU / Linux


2
Adicionei alguma formatação à sua resposta para torná-la mais legível. Espero ter entendido corretamente.
fra-san
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.