In der Erlang-Shell, wie kann ich lesen automatisch alle meine Platten Definition-Header
-
28-09-2019 - |
Frage
Dies wie die Frage beginnt:
Fast jedes Mal, wenn ich den Erlang-Shell verwenden, würde Ich mag einen Befehl auf Shell-Start ausgeführt wird, z.B. so etwas wie
rr("*.hrl").
oder ähnliches. Zur Zeit habe ich es jedes Mal, tippe ich eine Erlang-Shell starten und ich bin müde davon und vergessen es die ganze Zeit.
Aber das war eigentlich die falsche Frage! Für das, was ich wollte eigentlich zu tun ist mein Zeuge Definition-Header in jedem Shell Job zu lesen. Nicht verwenden, für andere der Schale integrierten Befehle beim Start ausgeführt wird. So habe ich die Frage Header geändert, um die Frage zu zeigen, wie sie fragen sollen.
Lösung
Während die Lösung mit .erlang versucht, stieß ich auf eine Lösung für die spezifische rr / 1 Nutzung:
Von der Mann-Seite von Shell:
Es gibt einige Unterstützung für das Lesen und Drucken von Datensätzen in der Schale. Während der Kompilierung wird Rekord Ausdrücke Tupel expressiven übersetzt sionen. In Laufzeit ist nicht bekannt, ob ein Tupel repräsentiert tatsächlich eine Aufzeichnung. Auch sind die Platten Definitionen von Compiler verfügbar verwendet bei Laufzeit. Also, um den Datensatz Syntax zu lesen und drucken Tupeln als aufzeichnet, wenn möglich, Plattendefinitionen von dem eingehalten werden müssen Schale selbst. Die Shell-Befehle zum Lesen, zu definieren, Vergessen, Auflisten und Druck von Datensatz werden im Folgenden beschrieben. Beachten Sie, dass jeder Job hat seinen eigenen Satz von Rekord Definitionen. Zur Erleichterung Angelegenheiten Rekord Definitionen in den Modulen shell_default und USER_DEFAULT (wenn geladen) jedes Mal, wenn ein neuer Auftrag gestartet werden gelesen. Zum Beispiel das Hinzufügen der Zeile
-include_lib("kernel/include/file.hrl").
zu USER_DEFAULT macht die Definition von file_info leicht verfügbar in die Schale.
Zur Klarstellung ich einig Beispiel hinzufügen:
Datei foo.hrl
:
-record(foo, {bar, baz=5}).
Datei: user_default.erl
:
-module(user_default).
-compile(export_all).
-include("foo.hrl"). % include all relevant record definition headers here
%% more stuff probably ...
Hier kann versuchen, in der Schale:
$ erl
Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.5 (abort with ^G)
1> #foo{}.
#foo{bar = undefined,baz = 5}
? kennt die Schale über die Aufzeichnung von foo.hrl
Andere Tipps
Die Datei .erlang
ausgewertet wird, wenn die Shell gestartet wird, aber es ist nicht im Zusammenhang mit der Shell ausgewertet. Dies bedeutet, dass es nur allgemeine Ausdrücke enthalten kann, die ausgewertet werden und nicht die Shell-Befehle. Leider rr()
ist ein Shell-Befehl (es initialisiert lokale Shell Datensätze zu erkennen), so dass es nicht in der .erlang
Datei verwendet werden kann.
Während der Benutzer Modul user_default
definiert, die vorgeladen werden müssen, können die Dateien enthalten, die unter Verwendung von -include
oder -include_lib
Datensatz Definitionen enthalten, diese Rekord Definitionen werden dann nur auf Funktionen innerhalb user_default
definiert zur Verfügung. user_default
wird als normal kompilierte Modul und exportierten Funktionen in ihm sind wie alle anderen Funktionen aufgerufen, so dass die Aufzeichnung Definitionen nicht innerhalb der Schale sichtbar. user_default
ermöglicht dem Benutzer, komplexere Funktionen zu definieren, die von innerhalb der Shell als Shell-Befehle aufgerufen werden können.
EDIT:
war ich teilweise falsch hier. Während ich war richtig, wie .erlang
ausgewertet wird und wie die Funktionen in user_default
genannt habe ich verpasst, wie user_default.erl
bei Shell-Start für die Aufzeichnung Definitionen gescannt wird, die in der Schale dann zur Verfügung stehen. Dank @Peer Stritzinger für dieses heraus zeigen.
Setzen Sie es in Datei mit dem Namen .erlang
in Ihrem Home-Verzeichnis (siehe Abschnitt 1.7.1 in http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html ).