Este mai bine să folosiți $ (pwd) sau $ PWD?

Am întâlnit BASEDIR=$(pwd) într-un script.

Există avantaje sau dezavantaje față de folosind BASEDIR="$PWD", altul decât poate, că $PWD ar putea fi suprascris?

Comentarii

  • câteva informații la unix.stackexchange.com/a/79621
  • @St é phaneChazelas Foarte interesant scrieți. ' sunt doar la jumătatea drumului și voi continua, dar, în măsura în care am înțeles-o, este ' mai bine să folosiți $(pwd), deoarece $PWD poate deveni depășit în anumite circumstanțe.
  • numai în unele cochilii (nu bash, dash, zsh sau ksh93 pentru instance) pwd vă va oferi potențial mai puține informații vechi decât $PWD în unele cazuri de colț. $(pwd) pe de altă parte, nu funcționează ' dacă directorul curent se termină cu caractere de linie nouă, înseamnă forking un proces (cu excepția ksh93) și folosiți resurse suplimentare. Punctul meu de vedere este utilizarea $PWD din $(pwd -P), ' nu merită folosit $(pwd).
  • în partea de jos, Stephane menționează utilizarea cd -P -- "$dir". dacă există vreo îndoială cu privire la valoarea $PWD puteți oricând cd -P . mai întâi. acest lucru poate fi, de asemenea, benefic, prin faptul că obțineți tot ceea ce $PWD a fost anterior în $OLDPWD și astfel le puteți compara ulterior – și următorul cd ...; cd - secvența vă va aduce cu siguranță înapoi în locul în care vă aflați acum.

Răspundeți

Dacă bash întâlnește $(pwd) va executa comanda pwd și va înlocui $(pwd) cu ieșirea acestei comenzi. $PWD este o variabilă care este aproape întotdeauna setată. pwd este o comandă shell integrată de mult timp.

Deci, $PWD va eșua dacă această variabilă nu este setată și $(pwd) va eșua dacă utilizați un shell care nu acceptă constructul $() experiența mea este destul de des cazul. Deci aș folosi $PWD.

Ca fiecare tocilar am propriul meu tutorial de scriptare shell

Comme nts

  • Am avut impresia că sintaxa `command` nu este de dorit și $(command) este de preferat. Din câte știu, acesta din urmă este compatibil cu POSIX, dar ' nu sunt 100% sigur.
  • @Minix $() este într-adevăr specificat de POSIX, deci în afara pre POSIX /bin/sh disponibil pe Solaris 10 și mai vechi și csh shell derivat, mă îndoiesc de multe alte shell-uri mainstream nu au această caracteristică.
  • @Minix: Aici este o întrebare recentă pe acest site care ilustrează o problemă legată de utilizarea backticks în loc de $()
  • corect, în loc de $ () ați putea folosi backticks, dar acest lucru nu va fi în cascadă, așa că nu l-am menționat
  • Bună minimapă pe tutorialul dvs. …

Răspuns

De asemenea, trebuie menționat faptul că este de dorit datorită performanței sale. Ca variabilă shell, poate fi rezolvată aproape instantaneu. $(pwd) este puțin mai confuz. Dacă inspectați man 1 bulitin pe un sistem cu Bash, veți vedea că pwd este o comandă încorporată, care vă poate conduce la cred că va fi la fel de rapid ca accesarea unei variabile. Cu toate acestea, construcția $() lansează întotdeauna un subshell nou (un proces nou) pentru a-și rula conținutul, indiferent de ce se află în interior . Același lucru este valabil și pentru backticks. Într-adevăr, când îl compar:

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) 

Primesc 1,52 secunde pentru apelul $(pwd) și 0,018 secunde pentru $PWD. Lansarea inutilă a sub-shell-urilor, precum și orice alte procese străine, trebuie evitată ori de câte ori este posibil. Acestea sunt „mult mai scumpe decât apelurile funcționale cu care ați putea fi obișnuit în alte limbi.

Comentarii

  • Că ' este o abordare interesantă, dar nu ' nu știu dacă sunt îngrijorat de performanța pe scripturile mele shell. De asemenea, mă întreb cum s-ar schimba performanța, dacă pwd se schimbă între interogare.
  • @Minix Mi-am modificat scriptul pentru ca corpul buclei să fie echo $PWD; pushd ..; echo $PWD; popd (cu >/dev/null după fiecare instrucțiune) și durează 0,05 secunde. Am eliminat apoi instrucțiunile de ecou (doar pushd / popd) și a durat 0,03.Deci, timpul pentru echo $PWD a fost încă de aproximativ 0,01 secunde. Am făcut ceva similar cu $(pwd) și a durat 2,2 secunde pentru fiecare buclă, deci 1,1 secunde pe $(pwd) apel.
  • Să nu fiu prea pretențios, dar îmi pot imagina că calculul care ar înlocui $PWD ar fi făcut în fundal înainte de evaluarea declarațiilor de ecou. Dar, în mod clar, accesarea $PWD este încă semnificativ mai rapidă, deci dacă compatibilitatea nu este o problemă, acesta este cu siguranță un motiv pentru a alege una peste alta. Vă mulțumim pentru munca testată atât de bine. 🙂

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *