È meglio usare $ (pwd) o $ PWD?


35

Ho incontrato BASEDIR=$(pwd)in una sceneggiatura.

Ci sono vantaggi o svantaggi rispetto all'uso BASEDIR="$PWD", oltre a quelli forse, che $PWDpotrebbero essere sovrascritti?



@ StéphaneChazelas Molto interessante scrivere. Sono solo a metà strada e continuerò, ma per quanto ho capito, è meglio usarlo $(pwd), perché $PWDpuò diventare obsoleto in determinate circostanze.
Minix,

2
solo in alcune shell (non bash, dash, zsh o ksh93 per esempio) ti forniranno pwdpotenzialmente meno informazioni obsolete rispetto $PWDad alcuni casi angolari. $(pwd)d'altra parte non funziona se la directory corrente termina con caratteri di nuova riga, significa biforcare un processo (tranne in ksh93) e usare risorse extra. Il mio punto di vista è l'uso $PWDdi $(pwd -P), non vale la pena usarlo $(pwd).
Stéphane Chazelas,

1
in fondo stephane menziona l'utilizzo cd -P -- "$dir". se c'è qualche dubbio sul valore di $PWDte puoi sempre cd -P .prima. questo può anche essere utile in quanto ottieni anche tutto ciò che $PWDera prima $OLDPWDe quindi puoi confrontarli in seguito - e la cd ...; cd -sequenza successiva ti riporterà sicuramente dove sei ora.
Mikeserv,

Risposte:


41

Se bash incontra $(pwd), eseguirà il comando pwd e lo sostituirà $(pwd)con l'output di questo comando. $PWDè una variabile che è quasi sempre impostata. pwd è un comando shell incorporato da molto tempo.

Quindi $PWDfallirà se questa variabile non è impostata e $(pwd)fallirà se stai usando una shell che non supporta il $()costrutto che è per la mia esperienza abbastanza spesso il caso. Quindi vorrei usare $PWD.

Come ogni nerd ho il mio tutorial di scripting di shell


6
Avevo l'impressione che la `command`sintassi fosse indesiderabile e $(command)fosse da preferire. Per quanto ne so, quest'ultimo è conforme POSIX, ma non ne sono sicuro al 100%.
Minix,

6
@Minix The $()è in effetti specificato da POSIX, quindi al di fuori del pre POSIX /bin/shdisponibile su Solaris 10 e cshshell precedenti e derivate, dubito che molte altre shell mainstream non abbiano questa funzionalità.
jlliagre,

@Minix: ecco una domanda recente su questo sito che illustra un problema con l'utilizzo di backtick invece di$()
PM 2Ring

corretto, invece di $ () potresti usare i backtick, ma questo non sarà a cascata quindi non ne ho parlato
Thorsten Staerk,

1
Bella minimappa sul tuo tutorial ....
kbtzr

6

Va anche detto che $PWDè desiderabile a causa delle sue prestazioni. Come variabile di shell, può essere risolto quasi istantaneamente. $(pwd)è un po 'più confuso. Se controlli man 1 bulitinsu un sistema con Bash, vedrai che pwdè un comando integrato, il che potrebbe farti credere che sarà veloce quanto accedere a una variabile. Tuttavia, il $()costrutto avvia sempre una nuova subshell (un nuovo processo) per eseguirne il contenuto, indipendentemente da ciò che è dentro. Lo stesso vale per i backtick. In effetti, quando lo benchmark:

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)

Ricevo 1,52 secondi per la $(pwd)chiamata e 0,018 secondi per $PWD. Il lancio non necessario di subshells, così come qualsiasi altro processo estraneo, dovrebbe essere evitato quando possibile. Sono molto più costosi delle chiamate di funzione a cui potresti essere abituato in altre lingue.


È un'interpretazione interessante, ma non so se sono preoccupato per le prestazioni sui miei script di shell. Mi chiedo anche come cambierebbe la prestazione, se il pwd cambia tra l'interrogazione.
Minix

@Minix Ho modificato il mio script in modo che il corpo del ciclo sia echo $PWD; pushd ..; echo $PWD; popd(con ulteriore >/dev/nulldopo ogni istruzione) e ci vogliono 0,05 secondi. Ho quindi rimosso le istruzioni echo (solo pushd / popd) e ci sono voluti 0,03. Quindi il tempo per echo $PWDera ancora 0,01 secondi circa. Ho fatto qualcosa di simile con $(pwd), e ci sono voluti 2,2 secondi per ogni ciclo, quindi 1,1 secondi per $(pwd)chiamata.
markasoftware

Non per essere troppo esigente, ma posso immaginare che il calcolo, che avrebbe sostituito, $PWDsarebbe stato fatto in background prima della valutazione delle dichiarazioni di eco. Ma chiaramente, l'accesso $PWDè ancora significativamente più veloce, quindi se la compatibilità non è un problema, questo è sicuramente un motivo per sceglierne uno sopra l'altro. Grazie per il lavoro svolto per testarlo in modo così approfondito. :)
Minix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.