Ich benutze die chdir()
C-Funktion, die es einem Benutzer ermöglicht, das Verzeichnis zu wechseln.
Die Funktion erkennt jedoch kein ‘~’. Muss ich eine explizite Konvertierung durchführen, also chdir
erkennt nicht, was ~ bedeutet? Weil meiner nicht funktioniert. Oder mache ich etwas falsch?
Die Tilde-Erweiterung wird von der Shell gehandhabt, nicht von einem Systemaufruf. Du könntest benutzen getenv()
um die Umgebungsvariable zu lesen HOME
und verwenden Sie das dann als Argument für chdir()
.
Es gibt Systemaufrufe, um diese Informationen zu erhalten, die auf einem einzelnen System zuverlässiger sein können, aber sie sind nicht vollständig portierbar. Schauen Sie sich zum Beispiel an getpwuid().
Beachten Sie, dass Posix spezifiziert die Semantik der Tilde-Erweiterung:
2.6.1 Tilde-Erweiterung
Ein “Tilde-Präfix” besteht aus einem nicht in Anführungszeichen gesetzten <tilde>
Zeichen am Anfang eines Wortes, gefolgt von allen Zeichen, die dem ersten ohne Anführungszeichen vorangehen <slash>
im Wort oder alle Zeichen im Wort, wenn es keine gibt <slash>
. In einer Zuweisung (siehe XBD-Variablenzuweisung ) können mehrere Tilde-Präfixe verwendet werden: am Anfang des Wortes (d.h. nach dem <equals-sign>
der Abtretung), nach allen nicht zitierten <colon>
, oder beides. Ein Tilde-Präfix in einer Zuweisung wird durch das erste Anführungszeichen abgeschlossen <colon>
oder <slash>
. Wenn keines der Zeichen im Tilde-Präfix in Anführungszeichen steht, werden die Zeichen im Tilde-Präfix nach dem <tilde>
werden als möglicher Anmeldename aus der Benutzerdatenbank behandelt. Ein portabler Anmeldename darf keine Zeichen außerhalb des Satzes enthalten, der in der Beschreibung der Umgebungsvariable LOGNAME in Andere XBD-Umgebungsvariablen angegeben ist. Wenn der Anmeldename null ist (d. h. das Tilde-Präfix enthält nur die Tilde), wird das Tilde-Präfix durch den Wert der Variablen ersetzt HOME
. Wenn HOME
nicht festgelegt ist, sind die Ergebnisse nicht spezifiziert. Andernfalls muss das Tilde-Präfix durch einen Pfadnamen des anfänglichen Arbeitsverzeichnisses ersetzt werden, der mit dem Anmeldenamen verknüpft ist, der mit der erhalten wurde getpwnam()
Funktion wie im Band System Interfaces von POSIX.1-2008 definiert. Wenn das System den Anmeldenamen nicht erkennt, sind die Ergebnisse undefiniert.
Beachten Sie insbesondere, dass wenn mein Benutzername lautet me
Die ergebnisse von cd ~
und cd ~me
darf nicht gleich sein! Insbesondere die HOME
Die Umgebungsvariable könnte auf einen anderen Wert als den von zurückgegebenen gesetzt werden getpwnam()
. Ich verwende diese Technik seit (weit über 25) Jahren, um meine einzustellen HOME
wo ich es haben will, und die wenigen Programme, die den Unterschied zwischen nicht erkennen cd ~
und cd ~me
sind einige (der vielen) Fluch meines Lebens.
Wenn Sie expandieren müssen
~username
müssen Sie verwendengetpwnam()
Anstatt vongetpwuid()
um das Home-Verzeichnis zu finden.– Jonathan Leffler
29. Februar 2012 um 3:46 Uhr