後で使用するために `bc` 関数を定義するにはどうすればよいでしょうか?

後で使用するために `bc` 関数を定義するにはどうすればよいでしょうか?

私はいつも、bc神秘的で興味深いと感じていました。オリジナルの 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
}

からbcPOSIX仕様:

指定されたファイルから入力を受け取り、標準入力から読み取ります。

答え2

シェルラッパー関数を書くよりも少し良いのは、環境変数でbcGNUのデフォルト引数を指定することです。ホームディレクトリに設定ファイルなどを置いて、bc.bcrc

export BC_ENV_ARGS="$HOME/.bcrc "

からGNUbcマニュアル:

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.

関連情報