Je lepší použít $ (pwd) nebo $ PWD?

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ždy cd -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

  • měl jsem dojem, že syntaxe `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ý.
  • @Minix $() 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 a csh odvozených skořápkách, pochybuji o mnoha jiné hlavní skořápky tuto funkci nemají.
  • @Minix: Zde je nedávná otázka na tomto webu, která ilustruje jeden problém s použitím zpětných lístků místo $()
  • správně, místo $ () můžete použít backticks, ale to nebude kaskádové, takže jsem to nezmínil
  • Pěkná minimapa ve vašem výukovém programu ….

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 za echo $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í. 🙂

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *