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.
programming-practices
user-interface
bash
Rohit Agarwal
quelle
quelle
rsync
verhä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 sprachenrsync
).ls -l dir
verhält sich anders ,ls -l dir/
wenndir
ein Link zu einem Verzeichnis.Antworten:
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.
quelle
dirname
,basename
undreadlink
. Ein sehr häufiges Problem ist die Verwendung${path##*/}
als Ersatz fürbasename
, aber wenn der Pfad mit einem Schrägstrich endet, der anstelle des letzten Pfadelements eine leere Zeichenfolge zurückgibt.rsync
${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 EntfernenDa 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.
ist das gleiche wie
Ihr Skript könnte also so aussehen:
und Sie müssen sich keine Sorgen machen, ob der Benutzer ein nachfolgendes / in den Pfad eingibt oder nicht.
quelle
bash
Verhalten, der Kernel macht es.Der verstorbene Jon Postel hatte in Abschnitt 3.2 von RFC 760 einige gute Ratschläge , die hier gelten:
quelle
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:
quelle
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.
quelle