Heute beim Schreiben meines Shell-Skripts.
Mir fällt plötzlich eine Frage ein.
Da cd /target_dir
und 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/logs
gegen 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?
shell
shell-script
Zen
quelle
quelle
Antworten:
Laut POSIX:
quelle
//
und/
mit ihrem Namen an der Bash-Eingabeaufforderung unterschiedlich anzeigen kann, und mitpwd
werde ich einen anderen Pfad anzeigen lassen, aber ihr Inhalt ist identisch! Warum?bash
das 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.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:
rsync
Behandelt 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 habenfoo
, aber fälschlicherweise glauben, dass es sich um ein Verzeichnis handelt, und etwas darin verschieben möchten,mv bar foo
wird die Datei überschrieben (Datenverlust, potenzielle Katastrophe), abermv 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.
quelle
Nein, das solltest du nicht. Es wird ein zusätzlicher unnötiger Schrägstrich hinzugefügt (
/
).Beispiel
Angenommen, Sie möchten das Java-
bin
Verzeichnis in IhrePATH
Variable exportieren.export PATH=$PATH:/opt/jre1.7.0_45/bin/
jetzt überprüfe es,
Beachten Sie den zusätzlichen Schrägstrich (
/
) vor Java, aber zum Glück funktioniert es nur in diesem Fall.quelle