Post by Sieghard SchicktanzPost by Helmut WaitzmannPost by Stefan Ramwenn ich einen Editor auf der Kommandozeile aufrufe, dann sollte
dieser zunächst tatsächlich das aktuelle Verzeichnis vorschlagen.
Genauer: Er sollte überhaupt kein Verzeichnis vorschlagen:
Wenn der Anwender dann einen Dateinamen, der keine „/“
enthält, eintippt, landet die Datei im Arbeitsverzeichnis.
Was ist ein "Arbeitsverzeichnis"? Ich wüßte da keine gute
Antwort darauf.
Das Arbeitsverzeichnis ist genau das Verzeichnis, in dem die
Dateinamen sind oder hineinkommen, deren Name außer den
Pfadkomponenten „.“ (auch mehrmals) keine weiteren
Pfadkomponenten enthält.
Post by Sieghard SchicktanzInsbes. nicht im Fall des erwähnten Gooey^WGUI-Editors, "wo"
der gestartet wird weiß ggfs. der Fenster- oder ein anderer
"Manager".
Ja, das ist ein Problem, und ich frage mich schon lange, warum
solche Fenstersysteme beim Start eines Programms keine
Möglichkeit bieten, ein Arbeitsverzeichnis oder eine
Voreinstellung dafür zu wählen. Das wäre spätestens im Fall,
dass das gestartete Programm mit einem Core‐Dump abstürzt,
wirklich wichtig: Der Core‐Dump kommt ins Arbeitsverzeichnis.
Da gibt es allerdings häufig Programme, die, einmal gestartet,
als Server leben bleiben können: Bei weiteren Startversuchen
nimmt dann die neu gestartete Instanz zur Server‐Instanz Kontakt
auf und übergibt ihre Parameterliste an die Server‐Instanz.
Beispiele sind Gimp, Firefox oder auch die Kombination aus Emacs
und Emacs‐Client.
Da zumindest im traditionellen Unix kein Programm einem
beliebigen anderen (außer seinen Prozess‐Kindern) einen
geöffneten Dateizugriffspfad übergeben kann, gibt es keine
Möglichkeit für den Client, dem Server verlässlich sein
Arbeitsverzeichnis mitzuteilen. Als Krücke benutzt er dann einen
absoluten Dateipfad, der im Augenblick zum Arbeitsverzeichnis
führt. Das fällt dann natürlich auf die Schnauze, wenn dem
Client das Arbeitsverzeichnis vom Platz bewegt oder umbenannt
wird.
Dadurch wird der Mechanismus des Arbeitsverzeichnisses für den
Anwender nahezu unbrauchbar.
(Das ist einer der Gründe, warum ich Desktop‐Systeme nicht mag:
Ich starte alle meine GUI‐Programme mit Server‐Funktion nicht
durch Klicken im Desktop‐System sondern als Hintergrund‐Jobs aus
einem interaktiven Shell im „xterm“, wo ich mein
Arbeitsverzeichnis selber wählen kann.)
Post by Sieghard Schicktanz[Nettes Beispiel eines Verwirrungsgenerators gelöscht]
Schreibst Du öfter mal solche netten Spaßprogramme?
Wenn's der Wahrheitsfindung dient.
Post by Sieghard SchicktanzPost by Helmut WaitzmannFazit: Arbeitsverzeichnisse können prinzipiell jederzeit
ohne, dass der davon betroffene Prozess das weiß, ihren Platz
im Dateisystem wechseln. ...
...
Post by Helmut WaitzmannEs bleibt nur die Aussage: Das Arbeitsverzeichnis ist das
Verzeichnis, in dem Dateien stehen, die mit einem Dateinamen,
der am Anfang 0mal oder öfter den Teil „./“, aber keine
weiteren „/“
Das passt aber auch nicht ganz. Mehrere "./" sind mehr oder
weniger witzlos, aber Unterverzeichnisse davon müssen dann
schon einen einfachen "/" als Kennung erhalten.
Ja sicher, aber das sind dann ja auch nicht mehr (unbedingt) das
Arbeitsverzeichnis (sondern Unterverzeichnisse von ihm).
Post by Sieghard SchicktanzPost by Helmut Waitzmannenthält, angefasst werden können. Desweiteren bezeichnet
auch der Dateiname „./“ immer das Arbeitsverzeichnis, egal,
wo es gerade ist.
Was dann auch leicht "ins Auge gehen" kann, wenn der Editor
"in" einem "fremden" oder System-Verzeichnis gestartet wird,
wie das z.B. bei einem Goo^WGUI gern der Fall ist - "/etc/xdg"
oder sowas vielleicht?
Ein Entwickler, der sein GUI das Arbeitsverzeichnis hinter dem
Rücken des Anwenders wechseln lässt, ohne zumindest dem Anwender
zu ermöglichen, das Arbeitsverzeichnis vor dem Start des Editors
zu wählen (s. o.), hat seine Hausaufgaben nicht gemacht.
Meiner Meinung nach gehört das Arbeitsverzeichnis[1] wie auch alle
anderen bereits geöffneten File‐Descriptors einer Prozessumgebung
zu den Eigenschaften, die (nicht nur) für ein GUI heilige Kühe sein
müssen: Daran hat niemand hinter dem Rücken des Anwenders
herumzufummeln: kein GUI, kein Window‐Manager, kein
Terminal‐Emulator, und ich gehe sogar so weit, zu fordern: auch
kein Programm‐Starter, der die Benutzerkennung wechselt („su“,
„sudo“, u. a.)
[1] Dass das Arbeitsverzeichnis so etwas ähnliches wie ein
bereits geöffneter File‐Descriptor (auf eben das
Arbeitsverzeichnis) ist, sieht man spätestens mit dem Aufkommen
der „…at(2)“‐Systemaufrufe: Sie erhalten als zusätzlichen
Parameter einen Datei‐Descriptor, der auf ein geöffnetes
Verzeichnis verweist, oder einen speziellen Datei‐Descriptor, der
das Arbeitsverzeichnis bezeichnet (siehe beispielsweise im
Manual‐Page „openat(2)“ den im Vergleich zu „open(2)“ vorhandenen
Extra‐Parameter „dirfd“ (in der deutschen Fassung des
Manual‐Pages: „Verzdd“) und das file status flag „O_PATH“).
Aus dem deutschen Manual‐Page „openat(2)“:
Der Systemaufruf openat() arbeitet genau wie open(), außer den
hier beschriebenen Unterschieden.
Falls der in Pfadname angegebene Pfadname relativ ist, dann wird
er relativ zu dem Verzeichnis interpretiert, auf das der
Dateideskriptor Verzdd verweist (statt relativ zu dem aktuellen
Arbeitsverzeichnis des aufrufenden Prozesses, wie es bei open()
für einen relativen Pfadnamen erfolgt).
Falls Pfadname relativ ist und Verzdd den speziellen Wert
AT_FDCWD enthält, dann wird Pfadname relativ zum aktuellen
Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie
open()).
Falls Pfadname absolut ist, wird Verzdd ignoriert.
Soweit das Zitat.
Ein Beispiel, welche heiligen Kühe man nicht schlachten soll:
Angenommen, ich möchte die Ausgaben (stdout und stderr) eines
Programms der Übersicht halber getrennt in zwei
Terminals (oder Terminal‐Emulatoren) sehen können.
Mit dem Terminal‐Emulator „xterm“ geht das so:
Ich starte in einem Terminal(‐Emulator), in dem ein interaktives
Shell läuft, das folgende Kommando:
xterm -e sh -c 'exec 1>&3 3>&- "$@"' sh mein_Programm 3>&1
Das bewirkt, dass die Daten, die „mein_Programm“ nach stdout
schreibt, in dem Terminal zu sehen sind, in dem ich das Kommando
eingetippt habe, während die Daten, die „mein_Programm“ nach
stderr schreibt, in dem neu geöffneten „xterm“ zu sehen sind.
Vor Jahren habe ich dasselbe mit einem Gnome‐Terminal anstelle
eines „xterm“ probiert und bin damit gescheitert: Das
Gnome‐Terminal hat sich erdreistet, den File‐Descriptor 3, den
ich ihm geöffnet mitgegeben habe, ungefragt zu schließen.
Wie heißt es so schön? Provide mechanism, not policy!
Post by Sieghard SchicktanzSag' das also besser mal den GUI- (jetzt hab' ich's richtig)
-Leuten...