Ve skriptu jsem narazil na BASEDIR=$(pwd). 
 Existují nějaké výhody nebo nevýhody oproti jinak než pomocí BASEDIR="$PWD" lze $PWD přepsat? 
Komentáře
- některé informace na unix.stackexchange.com/a/79621
 -  @St é phaneChazelas Velmi zajímavý zápis. Jsem ' m teprve v polovině a budu pokračovat, ale pokud jsem to pochopil, ' je lepší použít 
$(pwd), protože$PWDmůže za určitých okolností zastarat. -  pouze v některých skořápkách (nikoli bash, dash, zsh nebo ksh93 pro instance) vám v některých případech 
pwdpotenciálně poskytne méně zastaralých informací než$PWD.$(pwd)na druhou stranu nefunguje ', pokud aktuální adresář končí znaky nového řádku, což znamená rozvětvení procesu (kromě ksh93) a používat další zdroje. Můj názor je použití$PWDz$(pwd -P), ' se neoplatí používat$(pwd). -  dole je stephane zmiňuje pomocí 
cd -P -- "$dir". pokud existují pochybnosti o hodnotě$PWD, můžete vždycd -P .nejprve. to může být také výhodné v tom, že dostanete i to, co$PWDbylo předtím než v$OLDPWD, a můžete je poté porovnat – a dalšícd ...; cd -sekvence vás jistě přivede zpět tam, kde jste nyní. 
Odpovědět
 Pokud bash narazí na $(pwd), provede příkaz pwd a nahradí $(pwd) výstupem tohoto příkazu. $PWD je proměnná, která je téměř vždy nastavena. pwd je vestavěný příkaz shellu už dlouho. 
 Takže $PWD selže, pokud tato proměnná není nastavena a $(pwd) selže, pokud používáte prostředí, které nepodporuje konstrukci $(), která má být moje zkušenost docela často. Takže bych použil $PWD. 
Jako každý pitomec mám svůj vlastní Výukový program pro skriptování prostředí
Comme nts
Odpověď
 Je třeba také zmínit, že $PWD je žádoucí kvůli svému výkonu. Jako proměnnou prostředí je možné ji vyřešit téměř okamžitě. $(pwd) je trochu matoucí. Pokud zkontrolujete man 1 bulitin na systému s Bash, uvidíte, že pwd je vestavěný příkaz, který vás může vést k věřte, že to bude stejně rychlé jako přístup k proměnné. Konstrukce $() však vždy spustí nový subshell (nový proces) pro spuštění jejího obsahu, bez ohledu na to, co je uvnitř . Totéž platí i pro backticks. Když to porovnám, skutečně: 
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) 
 Za volání $(pwd) dostanu 1,52 sekundy a za $PWD. Kdykoli je to možné, měli byste se vyvarovat zbytečného spouštění dílčích skořápek, stejně jako jakýchkoli jiných cizích procesů. Jsou „mnohem dražší než volání funkcí, na která jste zvyklí v jiných jazycích. 
Komentáře
- To ' Je to zajímavý pohled, ale já ' nevím, jestli mám obavy o výkon mých shell skriptů. Zajímalo by mě také, jak by se výkon změnil, kdyby pwd se mění mezi dotazováním.
 -  @Minix Upravil jsem svůj skript tak, aby tělo smyčky bylo 
echo $PWD; pushd ..; echo $PWD; popd(s dalšími>/dev/nullpo každém prohlášení) a trvá to 0,05 sekundy. Poté jsem odstranil příkazy echo (pouze pushd / popd) a trvalo to 0,03.Takže čas zaecho $PWDbyl stále přibližně 0,01 sekundy. Udělal jsem něco podobného s$(pwd)a trvalo to 2,2 sekundy pro každou smyčku, takže 1,1 sekundy na$(pwd)volání. -  Aby to nebylo příliš vybíravé, ale dovedu si představit, že výpočet, který by nahradil 
$PWD, by se provedl na pozadí před hodnocením příkazů echo. Je však zřejmé, že přístup k$PWDje stále podstatně rychlejší, takže pokud se o kompatibilitu nemusíte zajímat, je to rozhodně důvod, proč si vybrat jeden nad druhým. Děkujeme za práci při tak důkladném testování. 🙂 
`command`byla nežádoucí a$(command)má být upřednostňováno. Pokud vím, je to POSIX kompatibilní, ale ' si nejsem 100% jistý.$()je skutečně specifikován POSIXem, takže mimo předcházející POSIX/bin/shdostupný na systému Solaris 10 a starších acshodvozených skořápkách, pochybuji o mnoha jiné hlavní skořápky tuto funkci nemají.$()