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$PWD
můž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
pwd
potenciá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í$PWD
z$(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$PWD
bylo 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/null
po 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 $PWD
byl 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$PWD
je 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/sh
dostupný na systému Solaris 10 a starších acsh
odvozených skořápkách, pochybuji o mnoha jiné hlavní skořápky tuto funkci nemají.$()