Onko parempi käyttää $ (pwd) vai $ PWD?

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 aina cd -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 seuraavaan cd ...; 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

  • Minusta tuntui, että `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.
  • @Minix $() 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 ja csh -tuotteissa. muissa valtavirran kuorissa ei ole tätä ominaisuutta.
  • @Minix: Tässä on tämän sivuston viimeaikainen kysymys, joka kuvaa yhtä ongelmaa backtickien käyttämisessä $()
  • oikein, $ (): n sijaan voit käyttää backtickeja, mutta tämä ei ole kaskadoitavissa, joten en maininnut sitä
  • Mukava minikartta opetusohjelmassa ….

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 aika echo $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. 🙂

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *