Empty output while piping to `bc`. Why?

Hi!

Let’s imagine I have a buffer with the one and only line: 1+1.

Now if I select the entire buffer with % and execute the following command from Kakoune command prompt: echo $sh{echo $kak_selection | bc} the result will be 2, which is what I’m expecting.

But if I select the entire buffer with % and press |bc<ret> keys the 1+1 line is replaced with empty string, meaning, that there is no output from bc command.

Why this happens?

The echo shell command sends its argument to stdout, followed by a newline.

$ echo 1+1 | hexdump -C
00000000  31 2b 31 0a                                       |1+1.|
00000004
$ echo 1+1 | bc
2

If you just select 1+1 and pipe it to bc, that doesn’t include the trailing newline.

$ printf 1+1 | hexdump -C
00000000  31 2b 31                                          |1+1|
00000003
$ printf 1+1 | bc
(standard_in) 1: syntax error

For whatever reason, bc really really wants a newline at the end of the expression, it does not recognise “end of file” as a valid terminator, much to the frustration of Kakoune users everywhere.

For my kakoune-inc-dec plugin, I eventually switched from using bc to using shell arithmetic just because it required less messing around with newlines.

I cannot reproduce this behaviour. Kakoune requires every buffer to have a least one line, and every line to have a terminating newline, so there will always be a newline at the end of the buffer, and so % should select the newline along with the expression, and bc should correctly evaluate it.

2 Likes

Thanks a lot for explanations! I was never aware of this newline bc requirement. Yes, including newline in selection makes piping to bc work correctly.
And additional thanks for the example with echo and printf: now I understand the difference much better.

Kakoune requires every buffer to have a least one line, and every line to have a terminating newline, so there will always be a newline at the end of the buffer, and so % should select the newline along with the expression, and bc should correctly evaluate it.

You are right: piping to bc does not work if there is no newline in selection. And if the one-line file is selected using % - there is always a new line. So, my initial example was misleading.

Some time ago, @Screwtapello helped me with this same issue.
So I updated the example in the Kakoune Wiki:

2 Likes