如何禁用 bc 中的换行符?

How to disable line breaks in bc?

有没有办法禁用 bc 将长数字分成几行的功能,比如 scale 控制小数位的变量?当然,我可以使用 sed,但是有 bc 的方法吗? http://www.gnu.org/software/bc/manual/html_mono/bc.html 的手册页仅说明每行的最大字符数为 70。

下面是一个数字被拆分的例子:

bc -l <<< "scale = 100; a(1) * 4"
3.141592653589793238462643383279502884197169399375105820974944592307\
8164062862089986280348253421170676

online bc man page 与我在 "Environment Variables" 下的不匹配;我的版本 (v1.06.95) 日期为 2006-06-11 的手册页声称您可以设置 BC_LINE_LENGTH=0 以禁用换行符,作为特定于 GNU 的扩展:

BC_LINE_LENGTH

This should be an integer specifying the number of characters in an output line for numbers. This includes the backslash and newline characters for long numbers. As an extension, the value of zero disables the multi-line feature. Any other value of this variable that is less than 3 sets the line length to 70.

您可以在 shell 中将 BC_LINE_LENGTH 设置为环境变量,或者在调用 bc:

之前内联
BC_LINE_LENGTH=0 bc -l <<< "scale = 100; a(1) * 4"

结语: 经过一番调查,gnu.org 的最新版本似乎是 v1.06 dated 2000-11-15 and matching the documentation published above, there are new upstream versions (v1.06.94 and v1.06.95) 托管在 alpha.gnu.org 上。这些较新版本包含 BC_LINE_LENGTH=0 功能。

参见Debian-specific bug report and patch created in 2004 and published in 2007 (!) that adds this extension, as well as Debian's bc changelog。看起来这应该在现代版本的 Debian 和 Ubuntu 中可用,但可能不会出现在其他发行版中。

在旧的实现中,选择一个任意大的数字 (BC_LINE_LENGTH=5000) 可能会让你到达你想去的地方。

您可以使用 read 没有 通常推荐的 -r 标志)将值作为一个不间断的行获取。

$ read pi <<< "$(bc -l <<< "scale = 100; a(1) * 4")"
$ echo $pi
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170676

read pi < <(bc -l <<< "scale = 100; a(1) * 4))

(当然不是 bc,但比调用 sed 更有效。)