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

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

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

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

Но… я ведь не могу потом это использовать повторно, правда? Я бы хотел иметь возможность сделать что-то вроде

me@home$ bc <<< "1/fact(937)"

решение1

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

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

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

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

#!/bin/sh

/usr/bin/bc ~/factorial.bc << EOF
$*
EOF

Функция (для помещения в файл оболочки rc)

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

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

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

решение2

Немного лучше, чем писать функцию оболочки оболочки для bc, вы можете указать аргументы по умолчанию для GNU bcв переменной окружения. Так что поместите файл конфигурации .bcrcили что-то еще в свой домашний каталог, а затем

export BC_ENV_ARGS="$HOME/.bcrc "

ИзbcРуководство GNU:

BC_ENV_ARGS  
    This is another mechanism to get arguments to bc. The format is the same
    as the command line arguments. These arguments are processed first, so
    any files listed in the environment arguments are processed before any
    command line argument files. This allows the user to set up "standard"
    options and files to be processed at every invocation of bc. The files
    in the environment variables would typically contain function
    definitions for functions the user wants defined every time bc is run.

Связанный контент