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 alltidcd -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 nestecd ...; 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.
Så $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
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 perecho $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. 🙂
`command`
syntaksen var uønsket og$(command)
div er å være å foretrekke. Så vidt jeg vet er sistnevnte POSIX-kompatibel, men jeg ' er ikke 100% sikker.$()
er faktisk spesifisert av POSIX så utenfor pre POSIX/bin/sh
tilgjengelig på Solaris 10 og eldre ogcsh
avledede skall, jeg tviler på mange andre vanlige skjell mangler den funksjonen.$()