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 lem vez deread $l. - Use
read -rpara 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$lcontiver%.
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
trconverte novas linhas no arquivo para nulos; o-0indicaxargspara 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
-
-L1diz axargspara invocar o programa uma vez para cada linha de entrada (cada um ). - Como
xargspode manipular apenas comandos simples, usesh -c '...'para executar o pipeline.