Er det bedre å bruke $ (pwd) eller $ PWD?

Jeg møtte BASEDIR=$(pwd) i et skript.

Er det noen fordeler eller ulemper fremfor bruker BASEDIR="$PWD", annet enn kanskje, at $PWD kunne overskrives?

Kommentarer

  • litt info på unix.stackexchange.com/a/79621
  • @St é phaneChazelas Veldig interessant skriv opp. Jeg ' er bare halvveis og vil fortsette, men så vidt jeg forsto det, er det ' bedre å bruke $(pwd), fordi $PWD kan bli foreldet under visse omstendigheter.
  • bare i noen skall (ikke bash, dash, zsh eller ksh93 for forekomst) vil pwd potensielt gi deg mindre foreldet informasjon enn $PWD i noen hjørnesaker. $(pwd) fungerer derimot ikke ' hvis den nåværende katalogen ender med nye linjetegn, betyr forking av en prosess (unntatt i ksh93) og bruk ekstra ressurser. Mitt syn er å bruke $PWD av $(pwd -P), det ' er ikke verdt å bruke $(pwd).
  • nederst der nevner stephane ved hjelp av cd -P -- "$dir". hvis det er tvil om verdien til $PWD kan du alltid cd -P . først. Dette kan også være gunstig ved at du også får det som $PWD var før det i $OLDPWD og så kan sammenligne dem etterpå – og neste cd ...; cd - sekvens vil sikkert føre deg tilbake til der du er nå.

Svar

Hvis bash møter $(pwd), vil den utføre kommandoen pwd og erstatte $(pwd) med denne kommandoens utgang. $PWD er en variabel som nesten alltid er satt. pwd er en innebygd skallkommando siden lenge.

$PWD mislykkes hvis denne variabelen ikke er angitt, og $(pwd) mislykkes hvis du bruker et skall som ikke støtter $() -konstruksjonen som skal min erfaring ganske ofte. Så jeg ville bruke $PWD.

Som hver nerd har jeg min egen shell scripting tutorial

Komme nts

  • Jeg hadde inntrykk av at `command` syntaksen var uønsket og $(command)
  • @Minix $() er faktisk spesifisert av POSIX så utenfor pre POSIX /bin/sh tilgjengelig på Solaris 10 og eldre og csh avledede skall, jeg tviler på mange andre vanlige skjell mangler den funksjonen.
  • @Minix: Her er et nylig spørsmål på dette nettstedet som illustrerer ett problem med å bruke backticks i stedet for $()
  • riktig, i stedet for $ () kan du bruke backticks, men dette vil ikke være cascadable, så jeg nevnte det ikke
  • Fin minimap på opplæringen din ….

Svar

Det skal også nevnes at $PWD er ønskelig på grunn av ytelsen. Som en skallvariabel kan den løses nesten umiddelbart. $(pwd) er litt mer forvirrende. Hvis du inspiserer man 1 bulitin på et system med Bash, vil du se at pwd er en innebygd kommando, som kan føre deg til tro at det vil være like raskt som å få tilgang til en variabel. Imidlertid lanserer $() en ny subshell (en ny prosess) for å kjøre innholdet, uavhengig av hva som er inne . Det samme gjelder backticks. Når jeg måler det:

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) 

får jeg 1,52 sekunder for $(pwd) samtalen og 0,018 sekunder for $PWD. Unødvendig lansering av subshells, så vel som andre fremmede prosesser, bør unngås når det er mulig. De er «mye dyrere enn funksjonskall som du kan være vant til på andre språk.

Kommentarer

  • At ' er en interessant oppfatning av det, men jeg vet ikke ' om jeg er bekymret for ytelsen på skallskriptene mine. Jeg lurer også på hvordan forestillingen ville endres, hvis pwd skifter mellom å spørre den.
  • @Minix Jeg endret skriptet mitt slik at sløyfekroppen var echo $PWD; pushd ..; echo $PWD; popd (med tillegg >/dev/null etter hver setning), og det tar 0,05 sekunder. Jeg fjernet deretter ekkosetningene (bare pushd / popd) og det tok 0,03.Så tiden per echo $PWD var fortsatt 0,01 sekunder eller så. Jeg gjorde noe lignende med $(pwd), og det tok 2,2 sekunder for hver sløyfe, så 1,1 sekunder per $(pwd) samtale.
  • Ikke for å være for kresen, men jeg kan forestille meg at beregningen, som ville erstatte $PWD, ville bli gjort i bakgrunnen før evalueringen av ekkosetningene. Men det er tydelig at tilgang til $PWD fremdeles er betydelig raskere, så hvis kompatibilitet ikke er en bekymring, er dette definitivt en grunn til å velge hverandre. Takk for arbeidet med å teste dette så grundig. 🙂

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *