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$PWDbizonyos 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)
pwdpotenciá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$PWDa$(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 mindigcd -P .. ez abban az esetben is előnyös lehet, ha azt is megkapja, ami$PWDvolt, ami előtte volt, a$OLDPWDfá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
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; popdlegyen (további>/dev/nullminden 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 azecho $PWDper 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.
$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. 🙂
`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.$()-t valóban a POSIX határozza meg, így a Solaris 10-nél és régebbi, valamint acshszármaztatott héjakon elérhető pre-POSIX/bin/shkívül kétes vagyok más mainstream kagylókból hiányzik ez a funkció.$()