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 altidcd -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æ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/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. 🙂
`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/sh
tilgængelig på Solaris 10 og ældre ogcsh
afledte skaller, tvivler jeg på mange andre mainstream-skaller mangler den funktion.$()