GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

Ich arbeite an einem Python-Skript, das Dateispeicherorte an einen scp-Unterprozess übergibt. Das ist alles in Ordnung, aber ich bin in einer Situation, in der ich am Ende einen Pfad mit einem Dateinamen verketten kann, sodass ein doppeltes „/“ vorhanden ist in dem Weg. Ich weiß, dass es Bash egal ist, ob Sie mehrere Dateitrennzeichen haben, aber ich frage mich, wie genau das behoben wird. Ist es Bash, das zusätzliches / entfernt s oder spielt es wirklich nie eine Rolle?

Ich frage, weil es mir mehrere Codezeilen spart, um nach zusätzlichem / zu suchen s beim Verketten. Ich weiß, es ist keine große Sache, aber ich bin auch neugierig. Ich habe ein Bash-Skript mit der Zeile cd //usr (anstelle von cd /usr ), was darauf hinzudeuten scheint, dass die Verwendung mehrerer / von Bedeutung sein könnte s in einem Pfad

Akzeptierte Antwort:

Mehrere Schrägstriche sind zulässig und entsprechen einem einzelnen Schrägstrich. Aus der Single Unix-Spezifikation (Version 4), Basisdefinitionen §3.271 Pfadname:„Mehrere aufeinanderfolgende Schrägstriche gelten als dasselbe wie ein Schrägstrich.“

Es gibt eine Ausnahme:Beginnt ein Pfadname mit zwei aufeinanderfolgenden Schrägstrichen, darf die erste Komponente nach dem führenden Schrägstrich implementierungsdefiniert interpretiert werden. (Referenz:Basisdefinitionen §4.13 Pfadnamenauflösung). Linux selbst tut dies nicht, obwohl einige Anwendungen dies tun könnten, und andere Unix-artige Systeme (z. B. Cygwin).

Ein nachgestellter / am Ende eines Pfadnamens zwingt den Pfadnamen, auf ein Verzeichnis zu verweisen. In (POSIX 1003.1-2001 (Single Unix v4) base definitions §4.11 pathname resolution, ein nachgestellter / entspricht einem nachgestellten /. . Die Basisdefinitionen von POSIX 1003.1-2008 (Single Unix v4) §4.13 heben die Anforderung auf, sie mit /. äquivalent zu machen , um mit nicht existierenden Verzeichnissen fertig zu werden (z.B. mkdir foo/ benötigt wird, um zu funktionieren, wohingegen mkdir foo/. würde nicht – siehe Begründung für die Änderung).

Für Programme, die auf einen Verzeichniseintrag einwirken, wenn foo ist ein symbolischer Link zu einem Verzeichnis, dann wird foo/ übergeben ist eine Möglichkeit, das Programm auf das Verzeichnis anstatt auf den symbolischen Link wirken zu lassen.

¹ Beachten Sie, dass dies nur für die Auflösung von Pfadnamen gilt, also beim Zugriff auf Dateien. Dateinamenmanipulationen funktionieren möglicherweise anders. Zum Beispiel basename und dirname Ignorieren Sie abschließende Schrägstriche.


Linux
  1. Wie portabel sind /dev/stdin, /dev/stdout und /dev/stderr?

  2. „Cache-Verzeichnis /home//.composer/cache/repo/https—packagist.org/ kann nicht erstellt werden, oder Verzeichnis ist nicht beschreibbar. Ohne Cache fortfahren“?

  3. Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

  4. echo oder print /dev/stdin /dev/stdout /dev/stderr

  5. Sollten Websites gemäß der empfohlenen Verwendung in /var/ oder /usr/ leben?

Die Dateien /proc/mounts, /etc/mtab und /proc/partitions verstehen

unix:///var/run/supervisor.sock keine solche Datei

Warum andere Dinge als /home auf eine separate Partition legen?

Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0

Warum sind < oder > erforderlich, um /dev/tcp

So ändern Sie das Standard-/tmp in /home/user/tmp