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 möglicherweise einen Pfad mit einem Dateinamen verketten muss, sodass /
der Pfad ein Doppel 'enthält . Ich weiß, dass es Bash egal ist, ob Sie mehrere Dateitrennzeichen haben, aber ich frage mich, wie genau das korrigiert wird. Ist es Bash, das extra /
s auszieht, oder spielt es wirklich keine Rolle?
Ich frage, weil es mir mehrere Codezeilen erspart, um /
beim Verketten nach zusätzlichen s zu suchen. Ich weiß, dass es keine große Sache ist, aber ich bin auch neugierig. Ich habe ein Bash-Skript mit der Zeile cd //usr
(anstelle von cd /usr
), was darauf hindeutet, dass die Verwendung mehrerer /
s in einem Pfad möglicherweise von Bedeutung ist
join
undabspath
und solche Befehle.Antworten:
Es sind mehrere Schrägstriche zulässig, die einem einzelnen Schrägstrich entsprechen. Aus der Single Unix-Spezifikation (Version 3) , Basisdefinitionen §3.266 Pfadname : "Mehrere aufeinanderfolgende Schrägstriche werden als ein Schrägstrich gleichgesetzt."
Es gibt eine Ausnahme: Wenn ein Pfadname mit genau zwei Schrägstrichen beginnt, kann er unterschiedlich behandelt werden ( siehe Basisdefinitionen §4.11 Auflösung von Pfadnamen ). Linux selbst tut dies nicht, obwohl einige Anwendungen und andere Unix-Systeme dies tun (zB Cygwin).
Ein Abschluß
/
am Ende eines Pfadnamens zwingt den Pfadnamen, auf ein Verzeichnis zu verweisen. In ( POSIX 1003,1-2.001 (Single Unix v3) Basisdefinitionen §4.11 Pfadname Auflösung , eine Hinter/
ist äquivalent zu einer Hinter/.
. POSIX 1003,1-2.008 (Single Unix v4) Basisdefinitionen §4.12 die Anforderung es äquivalent zu machen , entfernt/.
, um mit nicht existierenden Verzeichnissen fertig zu werden (zBmkdir foo/
muss funktionieren,mkdir foo/.
würde aber nicht - die Gründe für die Änderung sehen).Wenn es sich bei Programmen, die auf einen Verzeichniseintrag angewendet werden,
foo
um eine symbolische Verknüpfung zu einem Verzeichnis handelt, können Sie durch Übergebenfoo/
festlegen, dass das Programm auf das Verzeichnis und nicht auf die symbolische Verknüpfung angewendet wird.¹ Beachten Sie, dass dies nur für die Pfadnamenauflösung gilt, dh beim Zugriff auf Dateien. Manipulationen an Dateinamen funktionieren möglicherweise anders. Zum Beispiel
basename
unddirname
ignoriere abschließende Schrägstriche.quelle
/.
wurde nach einem späteren Diskussionsprozess entfernt, da es nicht eindeutig war. Wie auch immer, +1, da es schwierig ist, diese Art von Informationen gut zusammengefasst zu finden.Das Betriebssystem scheint sich auch nicht darum zu kümmern, da es gerade ein C-Programm mit einem direkten Systemaufruf ausprobiert hat, um es mit einem // im Pfad zu öffnen.
Sie können die Python-Bibliotheksfunktion os.path.normpath verwenden, um sie jedoch zu normalisieren, sodass Sie die Zeichenfolge nicht mehr nach Extras durchsuchen müssen. Andere Sprachen haben ähnliche Funktionen.
http://docs.python.org/library/os.path.html#os.path.normpath
quelle
Auf allen Unix-Systemen, die ich gesehen habe, ist es dasselbe wie ein einzelnes
/
, aber der Unix-Standard gibt das anAbhängig von Ihrem System kann es daher speziell gehandhabt werden. (Einige ältere Unix-Versionen verwendeten einen doppelten Zeilenabstand
/
für den Fernzugriff auf das Dateisystem, und möglicherweise gibt es noch einige, die dies tun.)quelle
//remote/...
in den Remote-Dateisystemzugriff, wahrscheinlich aus Gründen der Konsistenz mit Windows\\remote\...
.//remote/...
das gleiche wie das UNC- Pfadformat behandeln (kann aber derzeit keine gute Referenz googeln)\\remote\...
.//
besondere Weise behandelt werden, indem sie möglicherweisefalse
auf Absolutheit getestet werden und der Unix / POSIX-Spezifikation entsprechen.Verwenden Sie
os.path.join
in Python und Sie erhalten nicht mehrere Schrägstriche. Das Erstellen von Dateinamen durch Verketten von Zeichenfolgen wird als schlechter Python-Stil angesehen.quelle
/
sehr gut behandelt wurde, nicht bewältigen .Es gibt keinen Unterschied.
Mehrere Schrägstriche werden ignoriert (ohne Wirkung), zB:
quelle
Natürlich können Sie einen Pfad mit möglichen Mehrfach / (Schrägstrichen) normalisieren, indem Sie ihn durchlaufen
tr -s
... und dann benutzen
$NORMALIZED
Es sollte jedoch notwendig sein. Soweit mir bekannt ist, sollte jeder UNIX-Kernel Trennzeichen für gleichzeitige Pfade ignorieren - oder sie konzeptionell als ...
/./
... behandeln.quelle