Você parece ter chegado bem perto de algo que deveria funcionar. Eu modificaria para:
while IFS= read -r l; do printf "%s\n" "$l" | ./c_program; done < test_numbers.txt
- Diga
read l
em vez deread $l
. - Use
read -r
para ler linhas "cruas" (não interprete as barras invertidas). - Use
IFS=
para capturar espaços iniciais e finais. - Não diga
printf "$l"
; que será quebrado se$l
contiver%
.
Isso não parece ser uma boa opção para xargs
,
mas consegui apresentar o seguinte:
tr '\n' 'while IFS= read -r l; do printf "%s\n" "$l" | ./c_program; done < test_numbers.txt
' < test_numbers.txt | xargs -0 -L1 -I{} sh -c 'printf "%s\n" "$1" | ./c_program' _ {}
- O
tr
converte novas linhas no arquivo para nulos; o-0
indicaxargs
para esperar isso.- Eu fiz isso para obter o mesmo efeito que
read -r
; ou seja, não interprete as barras invertidas. Pode haver uma maneira melhor.
- Eu fiz isso para obter o mesmo efeito que
-
-L1
diz axargs
para invocar o programa uma vez para cada linha de entrada (cada um ). - Como
xargs
pode manipular apenas comandos simples, usesh -c '...'
para executar o pipeline.