Er det bedre at bruge $ (pwd) eller $ PWD?

Jeg stødte på BASEDIR=$(pwd) i et script.

Er der nogen fordele eller ulemper i forhold til ved hjælp af BASEDIR="$PWD", undtagen måske, at $PWD kunne overskrives?

Kommentarer

  • noget info på unix.stackexchange.com/a/79621
  • @St é phaneChazelas Meget interessant skriv op. Jeg ' er kun halvvejs igennem og vil fortsætte, men så vidt jeg forstod det, er det ' bedre at bruge $(pwd), fordi $PWD kan blive forældet under visse omstændigheder.
  • kun i nogle skaller (ikke bash, dash, zsh eller ksh93 for eksempel) vil pwd potentielt give dig mindre uaktuelle oplysninger end $PWD i nogle hjørnesager. $(pwd) fungerer derimod ikke ' hvis den aktuelle mappe ender med nye linjetegn, betyder forfalskning af en proces (undtagen i ksh93) og brug ekstra ressourcer. Min opfattelse er at bruge $PWD af $(pwd -P), det ' er ikke værd at bruge $(pwd).
  • nederst der nævnes stephane ved hjælp af cd -P -- "$dir". hvis der er tvivl om værdien af $PWD kan du altid cd -P . først. dette kan også være gavnligt, fordi du også får hvad $PWD var før det i $OLDPWD og så kan sammenligne dem bagefter – og den næste cd ...; cd - sekvens vil helt sikkert bringe dig tilbage til, hvor du er nu.

Svar

Hvis bash møder $(pwd), vil den udføre kommandoen pwd og erstatte $(pwd) med denne kommandos output. $PWD er en variabel, der næsten altid er indstillet. pwd er en indbygget shell-kommando siden lang tid.

$PWD mislykkes, hvis denne variabel ikke er indstillet, og $(pwd) mislykkes, hvis du bruger en shell, der ikke understøtter $() -konstruktionen, som skal min oplevelse temmelig ofte tilfældet. Så jeg ville bruge $PWD.

Som enhver nørd har jeg min egen shell scripting tutorial

Komme nts

  • Jeg var under det indtryk, at `command` syntaksen var uønsket og $(command) er at foretrække. Så vidt jeg ved, er sidstnævnte POSIX-kompatibel, men jeg ' er ikke 100% sikker.
  • @Minix $() er faktisk specificeret af POSIX, så uden for POSIX /bin/sh tilgængelig på Solaris 10 og ældre og csh afledte skaller, tvivler jeg på mange andre mainstream-skaller mangler den funktion.
  • @Minix: Her er et nyligt spørgsmål på dette websted, der illustrerer et problem med at bruge backticks i stedet for $()
  • korrekt, i stedet for $ () kan du bruge backticks, men dette kan ikke kaskades, så jeg nævnte det ikke
  • Dejligt minimap på din tutorial ….

Svar

Det skal også nævnes, at $PWD er ønskeligt på grund af dets ydeevne. Som en skalvariabel kan den løses næsten øjeblikkeligt. $(pwd) er lidt mere forvirrende. Hvis du inspicerer man 1 bulitin på et system med Bash, vil du se, at pwd er en indbygget kommando, som kan føre dig til mener, at det vil være lige så hurtigt som at få adgang til en variabel. $() -konstruktionen lancerer dog altid en ny subshell (en ny proces) for at køre dens indhold, uanset hvad der er indeni . Det samme gælder backticks. Når jeg benchmarker 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) opkaldet og 0,018 sekunder for $PWD. Unødvendig lancering af subshells såvel som andre fremmede processer bør undgås, når det er muligt. De “er meget dyrere end funktionsopkald, som du måske er vant til på andre sprog.

Kommentarer

  • At ' er en interessant optagelse af det, men jeg ved ikke ' hvis jeg er bekymret for ydeevnen på mine shell-scripts. Jeg spekulerer også på, hvordan forestillingen ville ændre sig, hvis pwd skifter imellem forespørgslen på det.
  • @Minix Jeg har ændret mit script, så sløjfekroppen er echo $PWD; pushd ..; echo $PWD; popd (med yderligere >/dev/null efter hver sætning), og det tager 0,05 sekunder. Jeg fjernede derefter ekkosætningerne (kun pushd / popd), og det tog 0,03.Så tiden pr. echo $PWD var stadig 0,01 sekunder eller deromkring. Jeg gjorde noget lignende med $(pwd), og det tog 2,2 sekunder for hver loop, så 1,1 sekunder pr. $(pwd) opkald.
  • For ikke at være for kræsen, men jeg kan forestille mig, at beregningen, der ville erstatte $PWD, ville blive foretaget i baggrunden før evalueringen af ekkosætningerne. Men det er tydeligt, at adgang til $PWD stadig er betydeligt hurtigere, så hvis kompatibilitet ikke er et problem, er dette bestemt en grund til at vælge den ene over den anden. Tak for arbejdet med at teste dette så grundigt. 🙂

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *