Spotkałem się BASEDIR=$(pwd)
w skrypcie.
Czy są jakieś zalety lub wady w stosunku do używania BASEDIR="$PWD"
, które $PWD
mogą być nadpisane?
shell-script
pwd
Minix
źródło
źródło
$(pwd)
, ponieważ$PWD
w niektórych okolicznościach może stać się nieaktualny.pwd
potencjalnie da ci mniej przestarzałych informacji niż$PWD
w niektórych przypadkach narożnych.$(pwd)
z drugiej strony nie działa, jeśli bieżący katalog kończy się znakami nowej linii, oznacza rozwidlenie procesu (z wyjątkiem ksh93) i użycie dodatkowych zasobów. Mój pogląd jest stosowanie$PWD
od$(pwd -P)
, to nie warto korzystać$(pwd)
.cd -P -- "$dir"
. jeśli masz jakiekolwiek wątpliwości co do wartości$PWD
, zawsze możeszcd -P .
najpierw. może to być również korzystne, ponieważ dostajesz to, co$PWD
było wcześniej,$OLDPWD
i możesz je później porównać - a następnacd ...; cd -
sekwencja z pewnością zaprowadzi cię z powrotem do miejsca, w którym jesteś teraz.Odpowiedzi:
Jeśli bash się napotka
$(pwd)
, wykona polecenie pwd i zastąpi$(pwd)
wyjściem tego polecenia.$PWD
jest zmienną, która prawie zawsze jest ustawiona. pwd to wbudowane polecenie powłoki od dłuższego czasu.Tak
$PWD
się nie powiedzie, jeśli ta zmienna nie jest ustawiona i$(pwd)
zawiedzie, jeśli używasz powłoki, która nie obsługuje$()
konstrukcji, co według mnie dość często zdarza się. Więc skorzystałbym$PWD
.Jak każdy nerd mam własny samouczek dotyczący skryptowania powłoki
źródło
`command`
składnia jest niepożądana i$(command)
należy ją preferować. O ile wiem, ten ostatni jest zgodny z POSIX, ale nie jestem w 100% pewien.$()
Rzeczywiście jest to określone przez POSIX, więc poza wcześniejszym POSIXem/bin/sh
dostępnym na Solarisie 10 i starszych icsh
pochodnych powłokach, wątpię, aby wiele innych popularnych powłok nie posiadało tej funkcji.$()
Należy również wspomnieć, że
$PWD
jest to pożądane ze względu na jego wydajność. Jako zmienna powłoki może być rozwiązana niemal natychmiast.$(pwd)
jest nieco bardziej mylące. Jeśli przeprowadzisz inspekcjęman 1 bulitin
w systemie za pomocą Bash, zobaczysz, żepwd
jest to wbudowane polecenie, które może prowadzić do przekonania, że będzie ono równie szybkie, jak dostęp do zmiennej. Jednak$()
konstrukcja zawsze uruchamia nową podpowłokę (nowy proces) w celu uruchomienia jej zawartości, niezależnie od tego, co jest w środku. To samo dotyczy backticks. Rzeczywiście, kiedy go porównuję:Dostaję 1,52 sekundy na
$(pwd)
połączenie i 0,018 sekundy na$PWD
. W miarę możliwości należy unikać niepotrzebnego uruchamiania podpowłoki, a także wszelkich innych procesów zewnętrznych. Są znacznie droższe niż wywołania funkcji, do których możesz być przyzwyczajony w innych językach.źródło
echo $PWD; pushd ..; echo $PWD; popd
(z dodatkowymi>/dev/null
po każdej instrukcji), i zajmuje to 0,05 sekundy. Następnie usunąłem instrukcje echa (tylko pushd / popd) i zajęło to 0,03. Tak więc czas naecho $PWD
nadal wynosił około 0,01 sekundy. Zrobiłem coś podobnego$(pwd)
i zajęło to 2,2 sekundy dla każdej pętli, więc 1,1 sekundy na$(pwd)
połączenie.$PWD
zostałyby wykonane w tle przed oceną instrukcji echa. Ale najwyraźniej dostęp$PWD
jest wciąż znacznie szybszy, więc jeśli kompatybilność nie stanowi problemu, jest to zdecydowanie powód, aby wybierać między sobą. Dziękujemy za pracę nad tak dokładnym testowaniem. :)