Tapasin komentosarjassa BASEDIR=$(pwd)
.
Onko mitään etuja tai haittoja Käyttämällä BASEDIR="$PWD"
muuta kuin ehkä, että $PWD
voidaan korvata?
Kommentit
- joitain tietoja osoitteessa unix.stackexchange.com/a/79621
- @St é phaneChazelas Erittäin mielenkiintoinen kirjoitus. Olen ' m vasta puolivälissä ja jatkan, mutta sikäli kuin ymmärsin sen, on ' parempi käyttää
$(pwd)
, koska$PWD
voi vanhentua tietyissä olosuhteissa. - vain joissakin kuorissa (ei bash, dash, zsh tai ksh93 esimerkki)
pwd
antaa sinulle mahdollisesti vähemmän vanhentuneita tietoja kuin$PWD
joissakin kulmatapauksissa.$(pwd)
toisaalta ei toimi ' ei toimi, jos nykyinen hakemisto päättyy uuden rivin merkkeihin, tarkoittaa prosessin haarautumista (paitsi ksh93: ssa) ja käyttää ylimääräisiä resursseja. Näkymäni on$PWD
-kohdan$(pwd -P)
käyttö, se ' ei ole syytä käyttää$(pwd)
. - alareunassa stepaani mainitsee käyttämällä
cd -P -- "$dir"
. Jos$PWD
-arvosta on epäilyksiä, voit ainacd -P .
ensin. tästä voi olla hyötyä myös siinä, että saat myös mitä$PWD
ennen sitä oli$OLDPWD
ja voit verrata niitä jälkikäteen – ja seuraavaancd ...; cd -
-sarja tuo sinut varmasti takaisin sinne, missä olet nyt.
Vastaa
Jos bash kohtaa $(pwd)
, se suorittaa komennon pwd ja korvaa $(pwd)
tämän komennon tuotoksella. $PWD
on muuttuja, joka on melkein aina asetettu. pwd on sisäänrakennettu shell-komento jo pitkään.
Joten $PWD
epäonnistuu, jos tätä muuttujaa ei ole asetettu ja $(pwd)
epäonnistuu, jos käytät kuorta, joka ei tue $()
-rakennetta kokemukseni on melko usein. Joten käytän $PWD
.
Kuten jokaisella nörtillä, minulla on oma komentosarjan komentosarjojen opetusohjelma
Comme nts
Vastaa
On myös mainittava, että $PWD
on suositeltava sen suorituskyvyn vuoksi. Kuorimuuttujana se voidaan ratkaista melkein välittömästi. $(pwd)
on hieman hämmentävä. Jos tarkastat man 1 bulitin
-järjestelmän Bash-järjestelmällä, huomaat, että pwd
on sisäänrakennettu komento, joka voi johtaa sinut uskoa, että se on yhtä nopea kuin muuttujan käyttö. $()
-rakenne kuitenkin käynnistää aina uuden alikuoren (uuden prosessin) sisällön ajamiseksi riippumatta siitä, mitä sisällä on . Sama asia koskee backtickeja. Todellakin, kun vertailen sitä:
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)
Saan 1,52 sekuntia $(pwd)
-puhelulle ja 0,018 sekuntia $PWD
. Aliosien tarpeetonta laukaisua samoin kuin muita ulkopuolisia prosesseja tulisi välttää aina kun se on mahdollista. Ne ovat paljon kalliimpia kuin toimintokutsut, joihin olet tottunut muilla kielillä.
Kommentit
- Että ' on mielenkiintoinen otos siitä, mutta en tiedä ' en tiedä, olenko huolissani shell-komentosarjojeni suorituskyvystä. pwd muuttuu kyselyn välillä.
- @Minix Muutin komentosarjaani siten, että silmukan runko on
echo $PWD; pushd ..; echo $PWD; popd
(lisäksi>/dev/null
jokaisen lauseen jälkeen), ja se kestää 0,05 sekuntia. Poistin sitten kaikulauseet (vain pushd / popd) ja kesti 0,03.Joten aikaecho $PWD
kohti oli edelleen noin 0,01 sekuntia. Tein jotain samanlaista$(pwd)
-palvelun kanssa, ja kesti 2,2 sekuntia jokaiselle silmukalle, joten 1,1 sekuntia$(pwd)
-puhelulle. - Ei ole liian nirso, mutta voin kuvitella, että laskenta, joka korvaisi
$PWD
, suoritettaisiin taustalla ennen kaiulausekkeiden arviointia. Mutta selvästi, pääsy$PWD
-palveluun on silti huomattavasti nopeampi, joten jos yhteensopivuus ei ole huolenaihe, se on ehdottomasti syy valita toinen toisensa yli. Kiitos työstä tämän testaamiseksi niin perusteellisesti. 🙂
`command`
-syntaksi ei ollut toivottavaa ja$(command)
on suositeltava. Sikäli kuin tiedän, jälkimmäinen on POSIX-yhteensopiva, mutta en ' ole 100% varma.$()
on todellakin määritelty POSIX: lla, joten epäonnistun monien POSIX-tiedostojen ulkopuolella/bin/sh
, jotka ovat käytettävissä Solaris 10: ssä ja vanhemmissa jacsh
-tuotteissa. muissa valtavirran kuorissa ei ole tätä ominaisuutta.$()