Ist es empfehlenswert, einen abschließenden Schrägstrich in Verzeichnisnamen zu verlangen?

9

Ich möchte den Benutzer meines Bash-Skripts bitten, einen Verzeichnispfad als Argument zu übergeben. Welche der folgenden Methoden ist eine gute Programmierpraxis?

  • Der Benutzer muss einen nachgestellten / (Schrägstrich) eingeben.
  • Erfordern, dass ein Benutzer keinen nachgestellten / (Schrägstrich) eingibt.
Rohit Agarwal
quelle
3
Beachten Sie, dass rsyncverhält sich anders in eine sehr wichtige Art und Weise auf das Vorhandensein von Hinter abhängig /, und so in manchen Fällen würden Sie für Konsistenz normalisieren wollen, in anderen würden Sie wollen sauber durchlaufen zu implementieren , was der Benutzer die (wenn sie wusste, dass sie mit sprachen rsync).
Sh1
Ein anderer , die mich vor kurzem überrascht ist , dass ls -l dirverhält sich anders , ls -l dir/wenn direin Link zu einem Verzeichnis.
Flimm

Antworten:

27

Best Practice ist, keine anzunehmen.

Wenn Sie Zugriff auf Path Builder-Dienstprogramme / -Klassen haben, verwenden Sie diese. Wenn nicht, schreiben Sie Ihren Code, um beide Formate zu akzeptieren und entsprechend zu handeln.

Nichts ist für den Benutzer ärgerlicher, als sich daran erinnern zu müssen, ob ein abschließender Schrägstrich hinzugefügt werden soll oder nicht.

ChrisF
quelle
6
Folgerung: Analysieren Sie Pfade immer mit den geeigneten Befehlszeilentools - dirname, basenameund readlink. Ein sehr häufiges Problem ist die Verwendung ${path##*/}als Ersatz für basename, aber wenn der Pfad mit einem Schrägstrich endet, der anstelle des letzten Pfadelements eine leere Zeichenfolge zurückgibt.
10.
1
+1 für die Verwendung von Dienstprogrammklassen. Ich kann nicht sagen, wie oft Entwickler das Rad beim Zusammenstellen von Pfaden neu erfunden haben, wenn die meisten Frameworks dies heutzutage problemlos können.
RationalGeek
1
Außerdem ärgere ich mich sehr, wenn ich bei einer Anwendung dies auf eine bestimmte Weise tun muss. Und manchmal kann der Benutzer nicht steuern, wie dieser Pfad geschrieben wird: Manchmal schreiben sie ihn, also entscheiden sie sich für das Schreiben mit oder ohne abschließenden Schrägstrich, aber in Fällen, in denen der Benutzer mithilfe von TAB automatisch vervollständigt, setzen viele Shells den abschließenden Schrägstrich. Sie würden also verlangen, dass der Benutzer es löscht? Und noch ärgerlicher ist es, wenn sich eine Anwendung anders verhält, wenn Sie den abschließenden Schrägstrich in ein Verzeichnis rsync
einfügen,
Ich musste kürzlich einen abschließenden Schrägstrich aus Benutzereingaben für die Verwendung mit rsync überprüfen (da er für diese Dinge empfindlich ist). Wie @ChrisF feststellte, ist es empfehlenswert, keine davon anzunehmen. Ich habe mir Folgendes als eine anmutige Art der Annahme von ${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))beidem ausgedacht : Ich habe es aus Gründen der Klarheit auch in einem Kern dokumentiert: Hinzufügen oder Entfernen
John Mark Mitchell
10

Da bash mehrere Schrägstriche ignoriert, können Sie davon ausgehen, dass der Benutzer keinen abschließenden Schrägstrich in den Pfad eingegeben und selbst einen Schrägstrich hinzugefügt hat.

cat /etc/hosts

ist das gleiche wie

cat /////etc//////////hosts

Ihr Skript könnte also so aussehen:

echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
  echo "found myfile!"
else
  echo "nope"
fi

und Sie müssen sich keine Sorgen machen, ob der Benutzer ein nachfolgendes / in den Pfad eingibt oder nicht.

user281377
quelle
5
Nit: Das ist kein bashVerhalten, der Kernel macht es.
Blrfl
7

Der verstorbene Jon Postel hatte in Abschnitt 3.2 von RFC 760 einige gute Ratschläge , die hier gelten:

Im Allgemeinen sollte eine Implementierung in ihrem Sendeverhalten konservativ und in ihrem Empfangsverhalten liberal sein. Das heißt, es sollte vorsichtig sein, wohlgeformte Datagramme zu senden, aber jedes Datagramm akzeptieren, das es interpretieren kann (z. B. keine Einwände gegen technische Fehler, bei denen die Bedeutung noch klar ist).

Blrfl
quelle
3

Konzeptionell ist der Schrägstrich nicht Teil des Namens. Der Schrägstrich ist nur ein Trennzeichen zwischen den Namen. Mein Home-Dir ist / home / stefan und nicht / home / stefan /.

Wenn Sie keinen abschließenden Schrägstrich erwarten, werden Sie nicht scheitern, wenn es einen gibt, wie ammoQ bereits bemerkt hat. Sie können jedoch leicht Namen und Variablen zusammenkleben, da Sie den Schrägstrich nicht zitieren müssen:

a="/home"
b="stefan"

dir=$a/$b
Benutzer unbekannt
quelle
0

Die Anforderung, dass das Verzeichnis keinen abschließenden Schrägstrich enthalten darf, wäre für die interaktive Verwendung auf der Konsole äußerst ärgerlich: Die automatische Vervollständigung mit TAB fügt automatisch einen abschließenden Schrägstrich für Verzeichnisse hinzu.

Sie müssen also unbedingt zulassen, dass Verzeichnisse mit einem abschließenden Schrägstrich angegeben werden.

oberlies
quelle