Ist es besser, $ (pwd) oder $ PWD zu verwenden?

Ich bin in einem Skript auf BASEDIR=$(pwd) gestoßen.

Gibt es Vor- oder Nachteile gegenüber Verwenden von BASEDIR="$PWD", außer vielleicht, dass $PWD überschrieben werden könnte?

Kommentare

  • einige Informationen unter unix.stackexchange.com/a/79621
  • @St é phaneChazelas Sehr interessantes Schreiben. Ich ' bin erst zur Hälfte fertig und werde fortfahren, aber soweit ich es verstanden habe, ist es ' besser, $(pwd), da $PWD unter bestimmten Umständen veraltet sein kann.
  • nur in einigen Shells (nicht Bash, Dash, Zsh oder Ksh93 für Instanz) pwd gibt Ihnen in einigen Eckfällen möglicherweise weniger veraltete Informationen als $PWD. $(pwd) funktioniert dagegen nicht ', wenn das aktuelle Verzeichnis mit Zeilenumbrüchen endet. Dies bedeutet, dass ein Prozess (außer in ksh93) und Verwenden Sie zusätzliche Ressourcen. Meiner Ansicht nach ist die Verwendung von $PWD von $(pwd -P) ' die Verwendung von $(pwd).
  • unten erwähnt Stephane mit cd -P -- "$dir". Wenn Zweifel am Wert von $PWD bestehen, können Sie immer zuerst cd -P . verwenden. Dies kann auch insofern von Vorteil sein, als Sie auch das erhalten, was $PWD zuvor in $OLDPWD war, und diese anschließend vergleichen können – und das nächste cd ...; cd - Die Sequenz bringt Sie sicher dorthin zurück, wo Sie jetzt sind.

Antwort

Wenn bash auf $(pwd) stößt, wird der Befehl pwd ausgeführt und $(pwd) durch die Ausgabe dieses Befehls ersetzt. $PWD ist eine Variable, die fast immer gesetzt wird. pwd ist seit langer Zeit ein eingebauter Shell-Befehl.

Also $PWD schlägt fehl, wenn diese Variable nicht gesetzt ist, und $(pwd) schlägt fehl, wenn Sie eine Shell verwenden, die das Konstrukt $() nicht unterstützt Meine Erfahrung ist ziemlich oft der Fall. Also würde ich $PWD verwenden.

Wie jeder Nerd habe ich meine eigene Tutorial für Shell-Skripte

Comme nts

  • Ich hatte den Eindruck, dass die Syntax `command` unerwünscht war und $(command) ist zu bevorzugen. Soweit ich weiß, ist letzteres POSIX-kompatibel, aber ich ' bin nicht 100% sicher.
  • @Minix Die $() wird in der Tat von POSIX angegeben. Außerhalb der vor POSIX /bin/sh verfügbaren Solaris 10 und älteren und csh abgeleiteten Shells bezweifle ich viele In anderen Mainstream-Shells fehlt diese Funktion.
  • @Minix: Hier ist eine aktuelle Frage auf dieser Site, die ein Problem bei der Verwendung von Backticks anstelle von veranschaulicht $()
  • richtig, anstelle von $ () könnten Sie Backticks verwenden, aber dies ist nicht kaskadierbar, daher habe ich es nicht erwähnt
  • Schöne Minikarte in Ihrem Tutorial ….

Antwort

Es sollte auch erwähnt werden, dass $PWD ist wegen seiner Leistung wünschenswert. Als Shell-Variable kann sie fast sofort aufgelöst werden. $(pwd) ist etwas verwirrender. Wenn Sie man 1 bulitin auf einem System mit Bash überprüfen, werden Sie feststellen, dass pwd ein integrierter Befehl ist, zu dem Sie möglicherweise führen Ich glaube, dass es genauso schnell sein wird wie der Zugriff auf eine Variable. Das Konstrukt $() startet jedoch immer eine neue Subshell (einen neuen Prozess), um deren Inhalt auszuführen, unabhängig davon, was darin enthalten ist . Das gleiche gilt für Backticks. In der Tat erhalte ich beim Benchmarking:

echo "Benchmarking $(pwd)..." time (for i in {1..1000}; do echo $(pwd) > /dev/null; done) echo "Benchmarking $PWD..." time (for i in {1..1000}; do echo $PWD > /dev/null; done) 

1,52 Sekunden für den Aufruf $(pwd) und 0,018 Sekunden für $PWD. Das unnötige Starten von Unterschalen sowie andere fremde Prozesse sollten nach Möglichkeit vermieden werden. Sie sind viel teurer als Funktionsaufrufe, die Sie in anderen Sprachen gewohnt sind.

Kommentare

  • Das ' ist eine interessante Einstellung, aber ich ' weiß nicht, ob ich über die Leistung meiner Shell-Skripte besorgt bin. Ich frage mich auch, wie sich die Leistung ändern würde, wenn Das pwd ändert sich zwischen der Abfrage.
  • @Minix Ich habe mein Skript so geändert, dass der Schleifenkörper echo $PWD; pushd ..; echo $PWD; popd ist (mit zusätzlichem >/dev/null nach jeder Anweisung), und es dauert 0,05 Sekunden. Ich habe dann die Echoanweisungen entfernt (nur pushd / popd) und es hat 0,03 gedauert.Die Zeit pro echo $PWD betrug also immer noch etwa 0,01 Sekunden. Ich habe mit $(pwd) etwas Ähnliches gemacht, und es dauerte 2,2 Sekunden für jede Schleife, also 1,1 Sekunden pro $(pwd) -Aufruf.
  • icht zu wählerisch zu sein, aber ich kann mir vorstellen, dass die Berechnung, die $PWD ersetzen würde, vor der Auswertung der Echoanweisungen im Hintergrund durchgeführt würde. Der Zugriff auf $PWD ist jedoch immer noch erheblich schneller. Wenn also die Kompatibilität keine Rolle spielt, ist dies definitiv ein Grund, eine über die andere zu wählen. Vielen Dank für die Arbeit, dies so gründlich zu testen. 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.