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 mindigcd -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
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 azecho $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.
$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 acsh
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ó.$()