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
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 encsh
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 perecho $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. 🙂
$(pwd)
, omdat$PWD
in bepaalde omstandigheden verouderd kan raken.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)
.cd -P -- "$dir"
. als er enige twijfel is over de waarde van$PWD
kun je altijd eerstcd -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 volgendecd ...; cd -
reeks zal u zeker terugbrengen naar waar u nu bent.