Как определить функцию `bc` для дальнейшего использования?

8

Я всегда находил что- bcто загадочное и интригующее. Это был один из самых оригинальных программ Unix. И это язык программирования сам по себе. Поэтому я с радостью использую любую возможность, которую смогу использовать.

Поскольку bc, кажется, не включает в себя факториальную функцию, я хочу определить ее следующим образом:

define fact(x) {
  if (x>1) {
    return (x * fact(x-1))
  }
  return (1)

}

Но ... тогда я не смогу это использовать, не так ли?

Я хотел бы иметь возможность сделать что-то вроде

me@home$ bc <<< "1/fact(937)"
ixtmixilix
источник

Ответы:

11

Сохраните определения вашей функции в файле вроде factorial.bc, а затем запустите

bc factorial.bc <<< '1/fact(937)'

Если вы хотите, чтобы функция факториала всегда загружалась при запуске bc, я бы предложил обернуть bcдвоичный файл сценарием или функцией оболочки (от того, как вы хотите его использовать, лучше зависит сценарий или функция ).

Скрипт ( bcпоставить ~/bin)

#!/bin/sh

bc ~/factorial.bc << EOF
$@
EOF

Функция (положить в файл оболочки RC)

bc () {
    bc ~/factorial.bc << EOF
    $@
    EOF
}

Из bcспецификаций POSIX :

Он должен принимать данные из любых заданных файлов, а затем читать из стандартного ввода.

jw013
источник
Может быть, вы можете назвать файл .bcrc? Можете ли вы поместить несколько определений в один файл?
Бернхард
Да, вы можете поместить любой допустимый синтаксис bc в файл. То, что вы называете файлом и куда его помещаете, полностью зависит от вас.
jw013