Ich bin BASEDIR=$(pwd)
in einem Drehbuch darauf gestoßen .
Gibt es Vor- oder Nachteile gegenüber der Verwendung BASEDIR="$PWD"
, die möglicherweise $PWD
überschrieben werden könnten?
shell-script
pwd
Minix
quelle
quelle
$(pwd)
, da es$PWD
unter bestimmten Umständen veraltet sein kann.pwd
möglicherweise weniger veraltete Informationen als$PWD
in einigen Eckfällen.$(pwd)
Funktioniert dagegen nicht, wenn das aktuelle Verzeichnis mit Zeilenumbrüchen endet, bedeutet dies, dass ein Prozess abgebrochen wird (außer in ksh93) und zusätzliche Ressourcen verwendet werden. Meine Ansicht ist , die Verwendung$PWD
von$(pwd -P)
, ist es nicht wert , mit$(pwd)
.cd -P -- "$dir"
. Wenn es irgendwelche Zweifel über den Wert von$PWD
dir gibt, kannst du immercd -P .
zuerst. Dies kann auch insofern von Vorteil sein, als Sie auch das bekommen, was$PWD
vorher war,$OLDPWD
und diese anschließend vergleichen können - und die nächstecd ...; cd -
Sequenz wird Sie mit Sicherheit dorthin zurückbringen, wo Sie jetzt sind.Antworten:
Wenn bash auf etwas stößt
$(pwd)
, wird der Befehl pwd ausgeführt und durch$(pwd)
die Ausgabe dieses Befehls ersetzt.$PWD
ist eine Variable, die fast immer gesetzt ist. pwd ist seit langer Zeit ein eingebauter Shell-Befehl.So
$PWD
wird scheitern , wenn diese Variable nicht gesetzt ist , und$(pwd)
wird fehlschlagen , wenn Sie eine Shell verwenden , die nicht die unterstützt$()
Konstrukt , das meiner Erfahrung ist ziemlich oft der Fall ist . Also würde ich verwenden$PWD
.Wie jeder Nerd habe ich mein eigenes Shell-Skript-Tutorial
quelle
`command`
Syntax unerwünscht war und$(command)
vorzuziehen ist. Soweit ich weiß, ist Letzteres POSIX-kompatibel, aber ich bin mir nicht zu 100% sicher.$()
wird in der Tat von POSIX spezifiziert, so dass ich bezweifle, dass viele andere Mainstream-Shells diese Funktion nicht haben, wenn/bin/sh
sie nicht unter Solaris 10 und älteren undcsh
abgeleiteten Shells verfügbar sind .$()
Es sollte auch erwähnt werden, dass dies
$PWD
aufgrund seiner Leistung wünschenswert ist. Als Shell-Variable kann sie fast sofort aufgelöst werden.$(pwd)
ist ein bisschen verwirrender. Wenn Sieman 1 bulitin
ein System mit Bash untersuchen, werden Sie feststellen, dasspwd
es sich um einen integrierten Befehl handelt, der Sie möglicherweise zu der Annahme verleitet, dass der Zugriff auf eine Variable genauso schnell erfolgt wie der Zugriff auf eine Variable. Das$()
Konstrukt startet jedoch immer eine neue Subshell (einen neuen Prozess), um dessen Inhalt auszuführen, unabhängig davon, was sich darin befindet. Das gleiche gilt für Backticks. In der Tat, wenn ich es benchmarken:Ich bekomme 1,52 Sekunden für den
$(pwd)
Anruf und 0,018 Sekunden für$PWD
. Unnötiges Starten von Subshells sowie andere fremde Prozesse sollten nach Möglichkeit vermieden werden. Sie sind viel teurer als Funktionsaufrufe, an die Sie in anderen Sprachen gewöhnt sind.quelle
echo $PWD; pushd ..; echo $PWD; popd
(mit zusätzlichen>/dev/null
nach jeder Anweisung) ist, und es dauert 0,05 Sekunden. Ich habe dann die echo-Anweisungen entfernt (nur pushd / popd) und es hat 0.03 gedauert. Die Zeit proecho $PWD
war also immer noch 0,01 Sekunden oder so. Ich habe etwas Ähnliches mit gemacht$(pwd)
, und es dauerte 2,2 Sekunden für jede Schleife, also 1,1 Sekunden pro$(pwd)
Anruf.$PWD
würde, im Hintergrund vor der Auswertung der Echo-Anweisungen erfolgen würde. Der Zugriff$PWD
ist jedoch immer noch erheblich schneller. Wenn also die Kompatibilität keine Rolle spielt, ist dies definitiv ein Grund, sich gegenseitig zu überlegen. Vielen Dank für die Arbeit, diese so gründlich zu testen. :)