dc
é uma ferramenta muito arcaica e um pouco mais antiga que bc
. Para citar a página da Wikipédia :
It is one of the oldest Unix utilities, predating even the invention of the C programming language; like other utilities of that vintage, it has a powerful set of features but an extremely terse syntax.
A sintaxe é uma notação de polimento inverso, que basicamente significa que os argumentos (isto é, números) vêm primeiro, seguidos pelo operador. Um exemplo básico do uso de dc
é:
echo '3 4 * p' | dc
Onde o p
é necessário para imprimir o resultado do cálculo. O bc
, por outro lado, usa a notação infixa mais familiar e, portanto, é mais intuitivo de usar. Aqui está um exemplo de bc
usage:
echo '3 * 4' | bc
Qual deles usar?
bc
é padronizado pelo POSIX e, portanto, é provavelmente o mais portátil dos dois (pelo menos nos sistemas modernos). Se você está fazendo o trabalho de calculadora manual, então é definitivamente a escolha (a menos que você seja um pouco masoquista). O dc
ainda pode ter seus usos, aqui é um caso em que a notação polonesa reversa é útil. Imagine que você tenha um programa que produza um fluxo de números que você deseja totalizar, por exemplo:
23
7
90
74
29
Para fazer isso com dc
é muito simples (pelo menos com implementações modernas em que cada operador pode receber mais de dois números), pois você só precisa anexar +p
ao fluxo, por exemplo:
{ gen_nums; echo +p } | dc
Mas com bc
é mais complexo, pois não só precisamos colocar um +
entre cada número e garantir que tudo esteja na mesma linha, mas também garantir que haja um nova linha no final:
{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc