chdir() in das Home-Verzeichnis

Lesezeit: 3 Minuten

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?

  • Wenn Sie expandieren müssen ~usernamemüssen Sie verwenden getpwnam() Anstatt von getpwuid() um das Home-Verzeichnis zu finden.

    – Jonathan Leffler

    29. Februar 2012 um 3:46 Uhr

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().

  • dh chdir(getenv("HOME")).

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    29. Februar 2012 um 3:38 Uhr


  • Ist chdir() Garantiert nicht abstürzen, wenn das Argument NULL ist? Wenn ja, wäre dies in Ordnung; Andernfalls wäre eine kleine Fehlerprüfung angebracht!

    – Ernest Friedman Hill

    29. Februar 2012 um 3:40 Uhr

  • Es wird nicht abstürzen, aber es wird sicherlich fehlschlagen, worüber Sie vielleicht wissen möchten.

    – Brian Roach

    29. Februar 2012 um 3:42 Uhr

  • Eine Garantie gibt es meines Wissens nicht.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    29. Februar 2012 um 5:26 Uhr

  • Hier ist ein Code-Snippet für alle, die die letztere Methode verwenden möchten. jonathonhill.net/2013-09-03/tilde-expansion-in-php

    – Jonathan Hill

    3. September 2013 um 18:02 Uhr


Benutzer-Avatar
Jonathan Leffler

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 meDie 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.

  • +1 für den Hinweis ~ und ~me beziehen sich auf verschiedene Quellen, um ihre Arbeit zu erledigen – gut zu wissen. Aber obwohl POSIX die Tilde-Erweiterung angibt, steht sie im Kapitel über Shells, nicht über Systemaufrufe.

    user49586

    6. April 2013 um 9:06 Uhr

1176630cookie-checkchdir() in das Home-Verzeichnis

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy