Eu tenho um script s1
que gera uma lista de números separados por ',' por exemplo 1,2,3,4
. Agora, quero fornecer esses números ao script s2
como argumentos, para que s2 seja executado em cada um deles e exiba seu resultado em uma linha separada. Por exemplo, se s2 multiplica números por dois, este seria o resultado que estou procurando:
2
4
6
8
O que estou fazendo agora é:
s1 | xargs -d "," | xargs -n1 s2
Mas eu sinto que estou fazendo isso de uma maneira tão tola! Então minha pergunta é:
Qual é a maneira correta de fazer isso?
Meu problema com minha solução é que ele está chamando xargs duas vezes e iterando a entrada duas vezes, o que não é razoável aos meus olhos, é claro, por meio de desempenho! A resposta xargs -d "," -n1
parece boa, mas não tenho certeza se é uma iteração apenas uma vez. Em caso afirmativo, verifique isso em sua resposta e eu aceitarei. A propósito, prefiro não usar o Perl, pois ele ainda está iterando duas vezes e também o Perl pode não existir em muitos sistemas.
Isso deve funcionar igualmente bem:
Caso de teste:
Resultado:
Se
s1
gerar essa lista seguida por um caractere de nova linha, você deseja removê-la, caso contrário, a última chamada seria com4\n
em vez de4
:Se
s2
puder aceitar vários argumentos, você pode fazer:que substitui temporariamente o IFS para ser uma vírgula, tudo em um subshell, para que
s2
veja a saídas1
dividida por vírgulas. O subshell é uma maneira abreviada de alterar o IFS sem salvar o valor anterior ou redefini-lo.Uma versão anterior desta resposta estava incorreta, provavelmente devido a uma configuração restante do IFS, corrompendo os resultados. Obrigado a ilkkachu por apontar meu erro .
Para fazer um loop manualmente sobre as saídas e fornecê-las individualmente para
s2
, demonstrando aqui como salvar e redefinir o IFS:ou execute os bits IFS em um subshell como antes:
Tente isto: