Is het beter om $ (pwd) of $ PWD te gebruiken?

Ik ben BASEDIR=$(pwd) tegengekomen in een script.

Zijn er voor- of nadelen ten opzichte van BASEDIR="$PWD" gebruiken, anders dan misschien, dat $PWD zou kunnen worden overschreven?

Reacties

  • wat info op unix.stackexchange.com/a/79621
  • @St é phaneChazelas Zeer interessant artikel. Ik ' m pas halverwege en zal doorgaan, maar voor zover ik het heb begrepen, is het ' beter om $(pwd), omdat $PWD in bepaalde omstandigheden verouderd kan raken.
  • alleen in sommige shells (niet bash, dash, zsh of ksh93 voor instantie) zal pwd u mogelijk minder oude informatie geven dan $PWD in sommige gevallen. $(pwd) aan de andere kant werkt ' niet als de huidige directory eindigt op newline-tekens, wat betekent dat een proces wordt gesplitst (behalve in ksh93) en gebruik extra middelen. Mijn mening gebruikt $PWD of $(pwd -P), het is ' s het niet waard om $(pwd).
  • onderaan noemt stephane het gebruik van cd -P -- "$dir". als er enige twijfel is over de waarde van $PWD kun je altijd eerst cd -P . gebruiken. dit kan ook gunstig zijn omdat u ook alles wat $PWD daarvoor was in $OLDPWD krijgt en ze dus daarna kunt vergelijken – en de volgende cd ...; cd - reeks zal u zeker terugbrengen naar waar u nu bent.

Antwoord

Als bash $(pwd) tegenkomt, zal het het commando pwd uitvoeren en $(pwd) vervangen door de uitvoer van dit commando. $PWD is een variabele die bijna altijd is ingesteld. pwd is een ingebouwde shell-opdracht sinds een lange tijd.

Dus $PWD zal mislukken als deze variabele niet is ingesteld en $(pwd) zal mislukken als u een shell gebruikt die de $() -constructie niet ondersteunt mijn ervaring is vrij vaak het geval. Dus ik zou $PWD gebruiken.

Zoals elke nerd heb ik mijn eigen shell scripting tutorial

Comme nts

  • Ik had de indruk dat de `command` syntaxis ongewenst was en $(command) heeft de voorkeur. Voorzover ik weet is dit laatste POSIX-compatibel, maar ik ' ben niet 100% zeker.
  • @Minix De $() wordt inderdaad gespecificeerd door POSIX, dus buiten de pre POSIX /bin/sh beschikbaar op Solaris 10 en ouder en csh afgeleide shells, betwijfel ik dat veel andere reguliere shells missen die functie.
  • @Minix: Hier is een recente vraag op deze site die een probleem illustreert met het gebruik van backticks in plaats van $()
  • correct, in plaats van $ () zou je backticks kunnen gebruiken, maar dit zal niet cascadeerbaar zijn, dus ik heb het niet vermeld
  • Leuke minimap op je tutorial ….

Answer

Er moet ook worden vermeld dat $PWD is wenselijk vanwege zijn prestaties. Als shell-variabele kan het vrijwel onmiddellijk worden opgelost. $(pwd) is wat verwarrender. Als je man 1 bulitin inspecteert op een systeem met Bash, “zul je zien dat pwd een ingebouwd commando is, wat je kan leiden tot denk dat het net zo snel zal zijn als het openen van een variabele. De $() -constructie start echter altijd een nieuwe subshell (een nieuw proces) om de inhoud uit te voeren, ongeacht wat erin zit . Hetzelfde geldt voor backticks. Inderdaad, als ik het benchmark:

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) 

Ik krijg 1,52 seconden voor de $(pwd) -oproep en 0,018 seconden voor $PWD. Onnodige lancering van subshells, evenals andere externe processen, moeten waar mogelijk worden vermeden. Ze “zijn veel duurder dan functieaanroepen waaraan u wellicht gewend bent in andere talen.

Opmerkingen

  • Dat ' is er een interessante kijk op, maar ik weet niet ' of ik me zorgen maak over de prestaties van mijn shellscripts. Ik vraag me ook af hoe de prestaties zouden veranderen, als de pwd verandert tussen het doorzoeken ervan.
  • @Minix Ik heb mijn script aangepast zodat de body van de lus echo $PWD; pushd ..; echo $PWD; popd is (met extra >/dev/null na elke instructie), en het duurt 0,05 seconden. Ik heb toen de echo-instructies verwijderd (alleen pushd / popd) en het duurde 0,03.Dus de tijd per echo $PWD was nog steeds 0,01 seconden of zo. Ik deed iets soortgelijks met $(pwd), en het duurde 2,2 seconden voor elke lus, dus 1,1 seconden per $(pwd) aanroep.
  • Om niet al te kieskeurig te zijn, maar ik kan me voorstellen dat de berekening die $PWD zou vervangen, op de achtergrond zou worden uitgevoerd vóór de evaluatie van de echo-statements. Maar het is duidelijk dat toegang tot $PWD nog steeds aanzienlijk sneller gaat, dus als compatibiliteit geen probleem is, is dit zeker een reden om de ene boven de andere te kiezen. Bedankt voor het werk om dit zo grondig te testen. 🙂

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *