Chcę tylko zrozumieć następujący wiersz kodu w powłoce. Służy do pobierania bieżącego katalogu roboczego. Zdaję sobie sprawę, że $(variable)
nazwa zwraca wartość wewnątrz nazwy zmiennej, ale co $(command)
ma zwrócić? Czy zwraca wartość po wykonaniu polecenia? W takim przypadku możemy użyć `
do wykonania polecenia.
CWD="$(cd "$(dirname $0)"; pwd)"
Te same dane wyjściowe można pobrać z następującego wiersza kodu również w innej wersji powłoki
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Nie jestem w stanie zrozumieć znaczenia $(cd..
i $(dirname
.
Czy ktoś mógłby mi pomóc dowiedzieć się, jak to polecenie jest wykonywane?
$()
vs``
.: stackoverflow.com/questions/9449778/ ...Odpowiedzi:
Użycie
$
podobnych${HOME}
daje wartość DOMU. Użycie$
podobnych$(echo foo)
oznacza uruchomienie wszystkiego, co znajduje się w nawiasach w podpowłoce i zwrócenie tego jako wartości. W moim przykładzie dostaniesz,foo
ponieważecho
napiszefoo
do standarduźródło
$(...)
to lepszy sposób na napisanie polecenia niż próba użycia cudzysłowów. Zastanów się nad napisaniem:gcclib=$(dirname $(dirname $(which gcc)))/lib
używając cytatów wstecz. Nawet zanim napotkasz trudności związane z robieniem tego w Markdown, jest to trudniejsze, ponieważ musisz uciec przed cudzysłowami zagnieżdżonych poleceń, podczas gdy nie robisz tego z$(...)
notacją.$(echo foo)
tworzy substytucję polecenia, a nie podpowłokę. Druga aktualna odpowiedź jest właściwa. Wydaje mi się, że podstawianie poleceń odbywa się w pewnym sensie w podpowłoce, ale nadal są to różne koncepcje.$(echo foo)
spróbuje uruchomić to, co jest zwrócone z nawiasów, najpierw uruchomi się,echo foo
a następnie spróbuje uruchomić,foo
co powoduje błądSpójrzmy na różne części polecenia.
BASH_SOURCE
jest zmienną tablicową bash zawierającą nazwy plików źródłowych. Więc"${BASH_SOURCE[0]}"
zwróci ci nazwę pliku skryptu.dirname
to narzędzie dostarczane przez GNU coreutils, które usuwa ostatni komponent z nazwy pliku. Tak więc, jeśli wykonasz skrypt, mówiącbash foo
,"$( dirname "${BASH_SOURCE[0]}" )"
zwróci.
. Gdybyś powiedziałbash ../foo
, to wróci..
; bobash /some/path/foo
wróci/some/path
.Na koniec całe polecenie
"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
pobiera bezwzględny katalog zawierający wywoływany skrypt.$(...)
umożliwia podstawianie poleceń, tj. pozwala wynikowi polecenia zastąpić samo polecenie i może być zagnieżdżony.źródło
dirname
zwraca ścieżkę wykonywanego pliku (względną lub bezwzględną do obecnego katalogu roboczego),cd
zmienia pwd na ten katalog ipwd
wypisuje bezwzględną ścieżkę do bieżącego katalogu roboczego. Ale dlaczego do nich dołącza&&
? A co się stanie,DIR
jeślicd
zawiedzie?&&
uniemożliwiapwd
uruchomienie programu w przypadkucd
niepowodzenia, coDIR
spowoduje, że będzie on pusty zamiast mieć niepoprawny katalog.