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/shbeschikbaar op Solaris 10 en ouder encshafgeleide 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; popdis (met extra>/dev/nullna 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 $PWDwas 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
$PWDzou vervangen, op de achtergrond zou worden uitgevoerd vóór de evaluatie van de echo-statements. Maar het is duidelijk dat toegang tot$PWDnog 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$PWDin bepaalde omstandigheden verouderd kan raken.pwdu mogelijk minder oude informatie geven dan$PWDin 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$PWDof$(pwd -P), het is ' s het niet waard om$(pwd).cd -P -- "$dir". als er enige twijfel is over de waarde van$PWDkun je altijd eerstcd -P .gebruiken. dit kan ook gunstig zijn omdat u ook alles wat$PWDdaarvoor was in$OLDPWDkrijgt en ze dus daarna kunt vergelijken – en de volgendecd ...; cd -reeks zal u zeker terugbrengen naar waar u nu bent.