Jobb a $ (pwd) vagy a $ PWD használata?

Találtam BASEDIR=$(pwd) t egy szkriptben.

Vannak-e előnyei vagy hátrányai A (z) BASEDIR="$PWD" használatával, lehet, hogy az $PWD felülírható?

Megjegyzések

  • néhány információ itt: unix.stackexchange.com/a/79621
  • @St é phaneChazelas Nagyon érdekes felírni. Én ' csak félúton vagyok és folytatom, de amennyire megértettem, ' jobb használni a $(pwd), mert az $PWD bizonyos körülmények között elavulttá válhat.
  • csak néhány héjban (a bash, dash, zsh vagy ksh93 esetében nem példány) pwd potenciálisan kevesebb elavult információt fog adni, mint egyes sarok esetekben $PWD. A $(pwd) viszont nem működik, ha az aktuális könyvtár újsoros karakterekkel végződik, ez egy folyamat elágazását jelenti (a ksh93 kivételével), és további erőforrások felhasználása. Véleményem szerint $PWD a $(pwd -P) fájlból, ' nem érdemes használni $(pwd).
  • alul stephane említést tesz az cd -P -- "$dir" használatával. ha kétség merül fel az $PWD értékével kapcsolatban, akkor mindig cd -P .. ez abban az esetben is előnyös lehet, ha azt is megkapja, ami $PWD volt, ami előtte volt, a $OLDPWD fájlban, és utána összehasonlíthatja őket – és a következő cd ...; cd - szekvencia biztosan visszahozza a jelenlegi helyére.

Válasz

Ha a bash találkozik $(pwd), végrehajtja a pwd parancsot, és az $(pwd) parancsot a parancs kimenetével cseréli le. $PWD egy változó, amely szinte mindig be van állítva. A pwd hosszú ideje egy beépített shell parancs.

Tehát $PWD sikertelen lesz, ha ez a változó nincs beállítva, és $(pwd) nem fog sikerülni, ha olyan héjat használ, amely nem támogatja a $() konstrukciót, tapasztalataim elég gyakran előfordulnak. Tehát a $PWD -t használnám.

Mint minden majomnak, megvan a saját shell szkriptek bemutatója

Comme nts

  • Az volt a benyomásom, hogy a `command` szintaxis nemkívánatos, és $(command) előnyösebb. Ha jól tudom, ez utóbbi POSIX-kompatibilis, de én ' nem vagyok 100% -ig biztos.
  • @Minix A $() -t valóban a POSIX határozza meg, így a Solaris 10-nél és régebbi, valamint a csh származtatott héjakon elérhető pre-POSIX /bin/sh kívül kétes vagyok más mainstream kagylókból hiányzik ez a funkció.
  • @Minix: Itt egy friss kérdés ezen a webhelyen, amely egy problémát mutat be a háttérgombok használata helyett $()
  • helyes, a $ () helyett backtickeket is használhat, de ez nem lesz lépcsőzetes, ezért nem említettem
  • Szép minimap az oktatóanyagon ….

Válasz

Azt is meg kell említeni, hogy $PWD teljesítménye miatt kívánatos. Héjváltozóként szinte azonnal megoldható. A $(pwd) kicsit zavaróbb. Ha a man 1 bulitin -t egy Bash rendszeren vizsgálja meg, akkor látni fogja, hogy a pwd egy beépített parancs, amely elvezethet hisz abban, hogy ugyanolyan gyors lesz, mint egy változó elérése. A $() konstrukció azonban mindig új alhéjat (új folyamatot) indít a tartalma futtatásához, függetlenül attól, hogy mi van benne . Ugyanez vonatkozik a backtickekre is. Valóban, amikor összehasonlítom:

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) 

1,52 másodpercet kapok a $(pwd) hívásért és 0,018 másodpercet a $PWD. Lehetőség szerint kerülni kell az alhéjak felesleges indítását, valamint minden egyéb külső folyamatot. Sokkal drágábbak, mint a más nyelveken megszokott függvényhívások.

Megjegyzések

  • Ez ' érdekes felvétel, de nem tudom, ' nem tudom, hogy aggódom-e a shell szkriptjeim teljesítményével kapcsolatban. Arra is kíváncsi vagyok, hogyan változna a teljesítmény, ha a pwd változik a lekérdezés között.
  • @Minix Módosítottam a szkriptet úgy, hogy a ciklustest echo $PWD; pushd ..; echo $PWD; popd legyen (további >/dev/null minden utasítás után), és ez 0,05 másodpercet vesz igénybe, majd eltávolítottam az echo utasításokat (csak pushd / popd), és 0,03 kellett.Tehát az echo $PWD per idõ körülbelül 0,01 másodperc volt. Valami hasonlót tettem a $(pwd) vel, és 2,2 másodpercig tartott minden hurok, tehát 1,1 másodperc <

híváson keresztül.

  • Nem túl válogatós, de el tudom képzelni, hogy az $PWD helyébe lépő számítást a háttérben végeznék az echo állítások kiértékelése előtt. De nyilvánvaló, hogy az $PWD elérése még mindig lényegesen gyorsabb, így ha a kompatibilitás nem okoz gondot, ez mindenképpen ok arra, hogy válasszunk egyet. Köszönöm az ilyen alapos tesztelésért végzett munkát. 🙂
  • Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük