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$PWDvoi vanhentua tietyissä olosuhteissa. - vain joissakin kuorissa (ei bash, dash, zsh tai ksh93 esimerkki)
pwdantaa sinulle mahdollisesti vähemmän vanhentuneita tietoja kuin$PWDjoissakin 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ä$PWDennen sitä oli$OLDPWDja 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/nulljokaisen lauseen jälkeen), ja se kestää 0,05 sekuntia. Poistin sitten kaikulauseet (vain pushd / popd) ja kesti 0,03.Joten aikaecho $PWDkohti 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.$()