Ich fand es schon immer bc
irgendwie geheimnisvoll und faszinierend. Es war eines derDieursprüngliche Unix-Programme. Und es ist eine Programmiersprache für sich. Daher nutze ich gerne jede Gelegenheit, sie zu verwenden. Da es bc
keine Fakultätsfunktion zu enthalten scheint, möchte ich eine wie folgt definieren:
define fact(x) {
if (x>1) {
return (x * fact(x-1))
}
return (1)
}
Aber … ich kann das dann nicht wiederverwenden, oder? Ich möchte in der Lage sein, so etwas zu tun wie
me@home$ bc <<< "1/fact(937)"
Antwort1
Speichern Sie Ihre Funktionsdefinitionen in einer Datei wie factorial.bc
und führen Sie dann aus
bc factorial.bc <<< '1/fact(937)'
Wenn Sie möchten, dass die Fakultätsfunktion immer geladen wird, wenn Sie ausführen bc
, würde ich vorschlagen, die bc
Binärdatei mit einem Shell-Skript oder einer Shell-Funktion zu umschließen (ob ein Skript oder eine Funktion am besten isthängt davon ab, wie Sie es verwenden möchten).
Skript ( bc
, einfügen ~/bin
)
#!/bin/sh
/usr/bin/bc ~/factorial.bc << EOF
$*
EOF
Funktion (zum Einfügen in die Shell-RC-Datei)
bc () {
command bc ~/factorial.bc << EOF
$*
EOF
}
Von dembc
POSIX-Spezifikationen:
Es übernimmt die Eingabe aus allen angegebenen Dateien und liest sie dann von der Standardeingabe.
Antwort2
Etwas besser als das Schreiben einer Shell-Wrapper-Funktion für bc
können Sie die Standardargumente für GNU bc
in einer Umgebungsvariable angeben. Legen Sie also eine Konfigurationsdatei .bcrc
oder etwas Ähnliches in Ihr Home-Verzeichnis und dann
export BC_ENV_ARGS="$HOME/.bcrc "
Von demGNU- bc
Handbuch:
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.