Sollten Shell-Skripte in absoluten oder relativen Pfaden funktionieren?

Sollten Shell-Skripte in absoluten oder relativen Pfaden funktionieren?

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, cdein Skript aufzurufen, aber dies sollte sparsam erfolgen. Mehrfachaufrufe cdsind ein „Codegeruch“. Absolute Pfade sind im Allgemeinen vorzuziehen.

cdkann fehlschlagen. Achten Sie darauf, Fehler richtig zu behandeln.

Nach einem Aufruf von cdwerden 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 PWDenthält immer das aktuelle Verzeichnis, sodass Sie es in einer anderen Variable speichern und cdspä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.

verwandte Informationen