Sollte ich einen Schrägstrich am Ende von Pfadvariablen im Shell-Skript verwenden oder nicht? [geschlossen]

11

Heute beim Schreiben meines Shell-Skripts.

Mir fällt plötzlich eine Frage ein.

Da cd /target_dirund cd /target_dir/beides funktioniert.
Sollte ich in einem Shell-Skript am Ende meiner Pfadvariablen einen Schrägstrich einfügen?
Wie LOG_PATH=/data/nginx/logsgegen LOG_PATH=/data/nginx/logs/.

Ich habe eine grobe Suche bei Google durchgeführt, aber keine Diskussion darüber gefunden. Vielleicht ist es zu einfach?

Im Moment fällt es mir wirklich schwer, mich für einen Stil zu entscheiden.
Aber ich habe den LOG_PATH=/target_dir/Stil etwas mehr bevorzugt .
Denn wenn ich mit bash eine automatische Vervollständigung durchführe, wird das Ergebnis mit einem Schrägstrich angezeigt.

Was ist deine Meinung dazu, warum?

Zen
quelle
Es gibt keine Regel. Beide Codierungsstile haben einige Vor- und Nachteile.
andcoz

Antworten:

8

Laut POSIX:

Definition eines Pfadnamens:

Eine Zeichenfolge, mit der eine Datei identifiziert wird. Es verfügt optional über beginnende <Slash> -Zeichen, gefolgt von null oder mehr Dateinamen, die durch <Slash> -Zeichen getrennt sind. Ein Pfadname kann optional ein oder mehrere nachfolgende <Slash> -Zeichen enthalten. Mehrere aufeinanderfolgende <Slash> -Zeichen entsprechen einem <Slash> , mit Ausnahme von genau zwei führenden <Slash> -Zeichen.

MichalH
quelle
@ Es ist interessant, dass ich CDs mit //und /mit ihrem Namen an der Bash-Eingabeaufforderung unterschiedlich anzeigen kann, und mit pwdwerde ich einen anderen Pfad anzeigen lassen, aber ihr Inhalt ist identisch! Warum?
Zen
1
Weil bashdas aktuelle Verzeichnis auf sehr naive Weise als Zeichenfolge verfolgt wird. Es wird nur heuristisch angehängt und aus dem Pfad entfernt, es wird keine Verbindung zum eigentlichen Dateisystem hergestellt. Eine Konsequenz ist, dass Sie eine CD in einen symbolischen Link einbinden und auf die gleiche Weise zurückkehren können (wenn bash nicht entschieden hat, dass es zu viel ist, und es neu initialisiert hat). Das andere beschreiben Sie. Sie sollten sich nicht auf die Verfolgung des aktuellen Verzeichnisses durch die Shell verlassen, da dies unzuverlässig ist.
Orion
Verwandte: Seltsamer Unterschied zwischen pwd und / bin / pwd .
G-Man sagt "Reinstate Monica"
6

Um auf der sicheren Seite zu sein, fügen Sie den Schrägstrich hinzu. Dies kann beim Verketten der Pfade zu mehreren Schrägstrichen führen, aber zumindest vermeiden Sie Probleme.

Einige Beispiele: rsyncBehandelt Pfade anders, wenn der abschließende Schrägstrich enthalten ist (er synchronisiert dieses Verzeichnis, anstatt ein anderes Unterverzeichnis zu erstellen). Symbolische Links zu Verzeichnissen verhalten sich manchmal unerwartet, wenn sie keinen abschließenden Schrägstrich haben - zumindest wird die Shell-Vervollständigung verwirrt. Sie wissen nie, ob der Befehl / das Skript, das Sie aufrufen, darauf beruht, dass der Schrägstrich auf ein bestimmtes Verhalten überprüft wird. Es könnte Sie sogar davor bewahren, etwas zu überschreiben. Wenn Sie beispielsweise eine Datei mit dem Namen haben foo, aber fälschlicherweise glauben, dass es sich um ein Verzeichnis handelt, und etwas darin verschieben möchten, mv bar foowird die Datei überschrieben (Datenverlust, potenzielle Katastrophe), aber mv bar foo/nur beschwert und nichts unternommen.

Abschließend ist es in den meisten Fällen egal, aber Sie sollten den Schrägstrich verwenden, um sich zu schützen und um dem menschlichen Leser klarer zu machen, was Sie in einem Skript vorhatten. Ein gelegentlicher Beobachter stellt sofort sicher, dass eine Variable auf ein Verzeichnis verweist, wenn sie mit einem Schrägstrich endet, und verwendet sie korrekt, wenn sie geändert werden muss.

Orion
quelle
2

Nein, das solltest du nicht. Es wird ein zusätzlicher unnötiger Schrägstrich hinzugefügt ( /).

Beispiel

Angenommen, Sie möchten das Java- binVerzeichnis in Ihre PATHVariable exportieren.

export PATH=$PATH:/opt/jre1.7.0_45/bin/

jetzt überprüfe es,

user@host:~$ which java
/opt/jre1.7.0_45/bin//java

Beachten Sie den zusätzlichen Schrägstrich ( /) vor Java, aber zum Glück funktioniert es nur in diesem Fall.

Arnab
quelle
Ich habe in diesem Link gesehen, dass es eine Antwort mit 31 Stimmen gibt, in der der Autor meint, wir sollten einen Schrägstrich hinzufügen. Ich bin verwirrt. stackoverflow.com/questions/980255/…
Zen
@ Zen, ja, ich habe es überprüft. Es war beim ersten Kommentar Ihrer Frage. Vielen Dank.
Arnab
6
Besser zwei Schrägstriche als keiner. Dieser ist hässlich, aber sicher ... die andere Option ist viel schlimmer und kann gefährlich sein.
Orion