Снаряды тут не при чем. Все, что они делают, это создают канал и запускают эти 3 команды, которые затем выполняются параллельно независимо от оболочки.
Здесь важно то, что обе хвостовые команды записывают файловый дескриптор в один и тот же конец записи одного и того же канала.
Если да:
printf foo1 >> file1; sleep 1
printf foo2 >> file2; sleep 1
printf 'bar1\n' >> file1; sleep 1
printf 'bar2\n' >> file2
Вот увидишь:
foo1foo2bar1
bar2
Потому что так они были написаны. Вы должны убедиться, что ваши команды выводят одну полную строку за раз,и что эти строки должны быть меньше, чем PIPE _BUF (4096 байт в Linux )для гарантии того, что запись ()будет атомарной (она также может записывать более одной полной строки за раз при условии все они заполнены, и их совокупный размер меньше, чем PIPE _BUF ).
С помощью GNU grep
вы можете сделать это, передав свои команды вgrep --line-buffered '^'
(tail -f./file1 | grep --line-buffered '^' &
tail -f./file2 | grep --line-buffered '^') | cat
Это гарантирует, что вы получите один write()
системный вызов для каждой строки вывода обеих команд. (В случаях, когда команды не заканчивают свою последнюю строку вывода, grep
добавит новая строка)
Согласно документу bc
:
expr / expr
The result of the expression is the quotient of the two expressions. The scale of the result is the value of the variable scale.
Так что используйте scale=0
для целочисленного деления:
>bc <<<'scale=2; 8/3'
2.66
>bc <<<'scale=0; 8/3'
2
Можно попробовать с постоянным током:
echo '21.15 1%60*p' | dc -f -
9,00