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ândcd -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ătorulcd ...; 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
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 pentruecho $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. 🙂
`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.$()
este într-adevăr specificat de POSIX, deci în afara pre POSIX/bin/sh
disponibil pe Solaris 10 și mai vechi șicsh
shell derivat, mă îndoiesc de multe alte shell-uri mainstream nu au această caracteristică.$()