Adicionando strings à stdin de um comando
Postado em 07/09/2025
Estava assistindo os excelente vídeos de bash do prof. Júlio Neves em seu canal no YouTube quando me surgiu uma dúvida: como adicionar uma string à saída (stdout) de um comando que servirá como entrada (stdin) para ou outro comando?
Imagine por exemplo que queira calcular o valor da divisão sucessiva do número
um até o dez em intervalos de dois. Utilizando o comando seq(1)
, podemos
listar estes números.
$ seq 1 2 10
1
3
5
7
9
Podemos então serializar esta saída trocando o separador do padrão newline
pelo operador de divisão (/
). Note que "escapamos" a barra utilizando a
contrabarra. Poderíamos ter colocado a barra entre aspas ou parênteses sem
nenhum problema.
$ seq -s\/ 1 2 10
1/3/5/7/9
Agora, utilizando um pipe, podemos redirecionar a saída do comando seq(1)
para a entrada do bc(1)
, a calculadora padrão do UNIX. O resultado, porém, não é o esperado.
$ seq -s\/ 1 2 10 | bc
0
O bc
nos retornou zero e o problema não é a falta de precisão da calculadora,
mas sim a falta do argumento scale para nos indicar a quantidade de dígitos
após o ponto decimal. Se é só isso então, como podemos fazer para adicionar
este argumento ao nosso comando?
Existem diversas maneiras de fazer isso, porém eu decidi utilizar o comando
cat(1)
da seguinte forma:
$ seq -s\/ 1 2 10 | cat <(echo -n "scale=8;") - | bc
.00105820
A construção em <(echo -n "scale=8;")
é chamada de process substitution e
cria um arquivo temporário a partir da saída de um comando (no caso o echo(1)
).
O comando cat(1)
enxerga esta construção como um arquivo e a concatena
com a entrada padrão (stdin
) representada pelo hífen.
Dessa forma, o comando bc(1)
recebe a cadeia de caracteres
"scale=8;1/3/5/7/9"
e faz o cálculo com uma precisão de oito dígitos.
Conclusão
O Bash é realmente uma ferramenta muito poderosa, frequentemente dispensando a construção de programas novos. Recomendo fortemente as aulas do prof. Júlio Neves no YouTube. Ele realmente fala como alguém que tem experiência de décadas no assunto e dá dicas valiosíssimas.