Przepraszam, jeśli to głupie pytanie, ale szukałem go bez powodzenia.
Co dokładnie robi druga linia?
#!/bin/sh
cd ${0%/*} || exit 1
Wiem, że pierwszy to shebang, drugi próbuje zmienić katalog, ale część jest myląca ${0%/*}
.
Czy możesz mi wyjaśnić tę drugą linię?
command-line
sh
Navaro
źródło
źródło
dirname
polecenia typu$(dirname $0)
dirname
jest wbudowana? Z pewnością nie ma go w Bash v4.3.11, który jest domyślną powłoką w Ubuntu Trusty.dirname
nie jest to wbudowana powłoka.Odpowiedzi:
${0}
jest pierwszym argumentem skryptu, tj. nazwą lub ścieżką skryptu. Jeśli uruchomić skrypt jakopath/to/script.sh
, a następnie${0}
będzie dokładnie taki ciąg:path/to/script.sh
.%/*
Część modyfikuje wartość${0}
. Oznacza to: weź wszystkie znaki, aż/
pojawi się nazwa pliku. W powyższym przykładzie${0%/*}
będziepath/to
.Możesz zobaczyć to w akcji na swojej powłoce:
Sh obsługuje wiele innych rodzajów „podstawiania parametrów”. Oto, na przykład, jak wziąć nazwę pliku zamiast ścieżki:
Ogólnie rzecz biorąc,
%
i%%
usuwaj sufiksy, podczas gdy#
i##
usuwaj prefiksy. Możesz przeczytać więcej o podstawianiu parametrów .źródło
|| exit 1
może być potrzebny, ponieważcd
może wyjść ze statusem 2, a nie 1, w przypadku błędu. Zgadzam się jednak, że nie jest to bardzo przydatne (zwykle programy nie dbają o określone statusy wyjścia). Prawdopodobnie jest to część większego skryptu?