Ich bin gerade dabei, einige Batch-Skripte in Shell-Skripte umzuwandeln. Die Batch-Skripte enthalten CD-Befehle, verwenden aber immer noch absolute Pfade.
foo.bat:
pushd
cd C:\some\directory
copy C:\some\directory\foo.txt C:\some\other\directory
popd
Ich glaube, dass das „cd“ in diesem Skript überflüssig ist, da die zu kopierende Datei mit absoluten Pfaden aufgerufen wird. Ich muss dies in ein Shell-Skript umwandeln. Ich habe die folgenden zwei Möglichkeiten:
test1.sh:
cp /some/directory/foo.txt /some/other/directory
test2.sh:
cd /some/directory
cp foo.txt /some/other/directory
Das erste verwendet nur cp mit absoluten Pfaden und das zweite verwendet cd und relative Pfade.
Meine Frage lautet: Welches dieser beiden Beispiele stellt hinsichtlich der Verwendung von Pfaden in Shell-Skripten die bessere Vorgehensweise dar?
Eine Nebenfrage: Wird Pushd/Popd in einem dieser Beispiele benötigt?
Antwort1
Es ist nicht unbedingt schlecht, cd
ein Skript aufzurufen, aber dies sollte sparsam erfolgen. Mehrfachaufrufe cd
sind ein „Codegeruch“. Absolute Pfade sind im Allgemeinen vorzuziehen.
cd
kann fehlschlagen. Achten Sie darauf, Fehler richtig zu behandeln.
Nach einem Aufruf von cd
werden relative Pfade ungültig. Insbesondere wenn Sie ein Wrapper-Skript schreiben, das einige Dinge vorbereitet und dann einen anderen Befehl ausführt, sollten Sie niemals aufrufen cd
: Der Benutzer könnte sich darauf verlassen, dass der Befehl im ursprünglichen Verzeichnis ausgeführt wird. Wenn Ihr Skript Dateinamen verwendet, die über die Befehlszeile übergeben werden, sind diese normalerweise relativ zum ursprünglichen Verzeichnis. Sie können "$PWD/"
ihnen ein Präfix voranstellen, um sie absolut zu machen, aber das führt zu schlechten Fehlermeldungen, wenn etwas schief geht.
Die Variable PWD
enthält immer das aktuelle Verzeichnis, sodass Sie es in einer anderen Variable speichern und cd
später durch einen Aufruf zurückwechseln können. Beachten Sie jedoch, dass dies in einigen Randfällen fehlschlagen kann, z. B. wenn ein Skript mit geringen Berechtigungen ausgeführt wird und nicht in sein ursprüngliches Verzeichnis zurückwechseln darf oder wenn ein Verzeichnis verschoben wird, während das Skript ausgeführt wird.
Vorsicht bei relativen Pfaden: Sie können mit beginnen -
, und Befehlsargumente, die mit beginnen, -
werden als Optionen interpretiert, wenn Sie keine Vorsichtsmaßnahmen treffen. Bei absoluten Pfaden gibt es dieses Problem nicht.
Antwort2
Soweit ich es erlebt habe, hängt es hauptsächlich von Ihren Bedürfnissen und Vorlieben ab.
Sie werden viele Dokumente finden, in denen dies dem Benutzer überlassen wird. Folgendes ist mir aufgefallen:
- Absolute Pfade sind klarer: Wer Ihr Skript warten/ändern muss (Sie oder andere), weiß jedes Mal, um welche Verzeichnisse es sich handelt.
- mit absoluten Pfaden können Sie sicher sein, dass es sich bei den betroffenen Verzeichnissen um die mit dem genauen Pfad handelt, den Sie in das Skript schreiben.
- Relative Pfade sind kürzer, aber Sie müssen sich über den Teilbaum im Klaren sein, in dem Sie arbeiten.
- Sie können die Dauer verkürzen, indem Sie wiederkehrende Pfade durch eine Variable am Anfang des Skripts ersetzen (z. B. /var/log/app/component/module/logfile.log -> $module_log_dir/logfile.log).
Wie thrig bemerkt hat, könnten Sie unmittelbar vor dem auszuführenden Befehl eine Prüfung der beteiligten Verzeichnisse hinzufügen.