Marcel Logen <
33320000...@ybtra.de>:
>> if tempdir="$( mktemp --directory )"
>
> Hier würde mir auch eine Datei reichen. Oder hat es einen beson-
> deren Grund, daß Du ein Verzeichnis erstellen läßt?
Das ist eine Vorsichtsmaßnahme: Falls das Dateisystem, in dem
die temporäre Datei erzeugt werden soll, über NFS verteilt wird,
ist das Erzeugen einer Datei im Gegensatz zum Erzeugen eines
Verzeichnisses keine unteilbare (atomare) Operation.
> if tempfil="$( mktemp )"
>
>> then
>> if
>> printf > "${tempdir%/}"/ausdruecke.bc \
>> '%s\n' hier die bc-Ausdruecke hinschreiben &&
>> exec {fd}< "${tempdir%/}"/ausdruecke.bc
>
> Das würde ich so schreiben:
>
> > "$tempfil" printf '%s\n' "$1" && exec {fd}< "$tempfil"
>
> So wird *mir* die Struktur klarer.
Ja, bei simple commands dürfen die Umlenkungen sogar ganz vorne
stehen; das stimmt (habe ich bisher aber nicht in der Gewohnheit).
>> then
>> ok() { return 0 ; }
>> else
>> ok() { return 1 ; }
>> fi
>> {
>> rm -Rf -- "$tempdir"
>
> Das wäre hier nicht unbedingt nötig, da /tmp beim Neustart des
> Rechners geleert wird.
Das ist Dateisystem‐Hygiene. Ich weiß ja nicht, wieviel in die
Datei reinkommen soll, und erst recht nicht, wie oft das Skript
laufen wird, bis das System einen Neustart erfährt.
[…]
>> exec bc -Optionen… -- /dev/fd/"$fd" restliche bc-Parameter
>
> exec bc -q -- /dev/fd/"$fd" "$2"
>
> sollte doch funktionieren, wenn ich beim Aufruf des Wrappers nur
> zwei Argumente angebe.
Das ist der Grund, warum ich mein Skript ausdrücklich «Fragment»
genannt habe: Eigentlich müsste es zuerst die übergebenen
Parameter – die ja allesamt (außer den Optionen «-e» mit ihren
jeweiligen Parametern) an «bc» weitergereicht werden sollen –
untersuchen, die Option «-e» mit ihrem jeweiligem Parameter
herausfischen und diese Parameter in die Aufrufparameter des
«printf»‐Kommandos, das die temporäre Datei füllt, stecken. Die
restlichen Parameter müsste es darauf hin untersuchen, wo die
«bc»‐Optionen enden und die übergebenen Dateinamen beginnen.
Dann müsste es an «bc» die Optionen, danach die temporäre Datei
und schließlich die restlichen Dateiparameter übergeben.
Ich vermute, dass ich den Aufwand im allgemeinen nicht machen
wollte, sondern in der Praxis lieber darauf verzichten würde, die
«bc»‐Option «-e» überhaupt zu benutzen (auch wenn sie wirklich
sehr wünschenswert ist).
>
>> else
>> exit 2
>> fi
>
> Wobei dann $1 die Ausdrücke wären und $2 das jeweils aufgerufene
> bc-Script. Also so:
>
> ./bc-wrapper 'a[0]=5; b[0]=2^255-19' bc-eea
>
Ja. Wenn man sich darauf beschränken will, dass der «bc»‐Wrapper
nur dafür geeignet ist, genau eine Option «-e» mit ihrem
Parameter zu simulieren und genau einen Namen einer an «bc» zu
übergebenden Datei entgegenzunehmen, dann reicht das so.
Da kann ich nicht viel damit anfangen: Mein Firefox mit
abgestelltem Javascript zeigt mir das in einer kaum lesbaren Form
an.
Immerhin kann ich erkennen, dass das vor kurzem in «de.test»
eingestellt wurde. Allerdings hat mir «de.test» vorhin mit
1,5 GB mein Dateisystem zugeknallt[1], so dass ich gezwungen war,
«de.test» zu leeren.
[1] Dort wütet jemand, der seit Tagen mehrmals pro Sekunde das
immergleiche Posting mit gefälschter Absenderadresse einstellt,
und diejenigen Newsserver, von denen ich News beziehe, liefern
mir halt den Müll.
> wo bc-eea mein bc-Script für den erweiterten euklidischen Algorith-
> mus ist und a[0] und b[0] die Eingabewerte, die auf der command
> line angegeben werden sollen. Das gesuchte Ergebnis ist s[0], das
> multiplikative Inverse von 5 mod 2^255-19.
>
>> Lästig an dem zu schreibenden Wrapper‐Bash‐Skript ist das
>> Parsen und (teilweise) Interpretieren der übergebenen
>> Parameter. Anschließend müssen alle (außer der Option «-e»
>> mitsamt ihrem Parameter) an «bc» übergeben werden, wobei
>> der Name für die geöffnete Datei («/dev/fd/"$fd"») als
>> erster Dateiparameter übergeben werden muss.
>
> -e spielt hier bei GNU-bc keine Rolle, da es diese Option da nicht
> gibt. Deren Verhalten soll ja gerade emuliert werden.
Ja, genau. Dafür muss das «bc»‐Wrapper‐Skript alle an es
übergebenen Parameter darauf hin untersuchen, ob es sie
unverändert an «bc» weiterreicht oder – im Fall der Option «-e»
mitsamt deren Parameter – selber verarbeitet und für den
GNU‐«bc»‐Aufruf umsetzt.
> Und wenn ich die bc-Ausdrücke in halbe Anführungszeichen setze,
> sollten sie ja als *ein* Parameter ($1) aufgefaßt werden, oder?
Ja. Dann macht der Shell einen einzigen Parameter daraus und
übergibt ihn dem Wrapper‐Skript. Sofern «bc» damit zurechtkommt,
müsste das funktionieren. Beispielsweise enthalten
Funktionsdefinitionen in «bc» zwingend ein Newline‐Zeichen, das
man nicht durch einen Strichpunkt ersetzen kann. Man braucht
also mindestens 2 «-e»‐Optionen dafür, wenn man nicht das
Newline‐Zeichen in den Parameter packen will. (Das kriegt der
Shell zwar hin, ist aber – wenn man sich auf den POSIX‐Standard
beschränken will – nicht gerade anwenderfreundlich einzutippen.)