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$PWDkan blive forældet under visse omstændigheder. - kun i nogle skaller (ikke bash, dash, zsh eller ksh93 for eksempel) vil
pwdpotentielt give dig mindre uaktuelle oplysninger end$PWDi 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$PWDaf$(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$PWDkan du altidcd -P .først. dette kan også være gavnligt, fordi du også får hvad$PWDvar før det i$OLDPWDog så kan sammenligne dem bagefter – og den næstecd ...; 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.
Så $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
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/nullefter 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 $PWDvar 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$PWDstadig 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. 🙂
`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.$()er faktisk specificeret af POSIX, så uden for POSIX/bin/shtilgængelig på Solaris 10 og ældre ogcshafledte skaller, tvivler jeg på mange andre mainstream-skaller mangler den funktion.$()