Co oznacza -f w instrukcji if w skrypcie bash?

Próbuję zrozumieć ten fragment kodu:

if [ -f /etc/bashrc ]; then . /etc/bashrc fi 

Nie mam pewności co dokładnie oznacza -f.

Odpowiedź

Odpowiednia strona podręcznika do sprawdzenia dotyczy samej powłoki, bash, ponieważ -f to funkcja, którą zapewnia powłoka, jest ona wbudowana w bash.

W moim systemie (CentOS 7), dobra strona podręcznika opisuje to. Element grep może nie dawać takich samych wyników w innych dystrybucjach. Niemniej jednak, jeśli uruchomisz man bash, a następnie wyszukasz „-f”, powinno dać żądane wyniki.

$ man bash | grep -A1 "\-f file$" -f file True if file exists and is a regular file. $ 

Odpowiedź

Krótko mówiąc, fragment kodu będzie źródłem pliku /etc/bashrc, jeśli istnieje, a istnienie jest weryfikowane poleceniem [, dla którego -f jest operatorem / parametrem.

if...then...else...fi w skryptach powłoki ocenia stan zakończenia poleceń – 0 w przypadku pomyślnego zakończenia. Dlatego warto zrobić coś takiego:

if ping -c 4 google.com; then echo "We have a connection!" fi 

W twoim przypadku polecenie to [ które jest również znane jako polecenie test. Dlatego też „d byłoby całkowicie poprawne, aby wykonać

if test -f /etc/bashrc; then . /etc/bashrc fi 

Opcja -f flaga weryfikuje dwie rzeczy: podana ścieżka istnieje i jest zwykłym plikiem. Jeśli /etc/bashrc jest katalogiem lub go brakuje, test powinien zwrócić niezerowy kod zakończenia, aby zasygnalizować błąd.

To polecenie pierwotnie było oddzielnym poleceniem, czyli nie część poleceń wbudowanych powłoki. Obecnie większość powłok podobnych do Bournea ma ją jako wbudowaną i właśnie tego powłoka będzie używać.

Na marginesie, /etc/bashrc wydaje się niepotrzebnym dodatkowym plikiem, którego używa twój administrator lub oryginalny autor fragmentu kodu. Istnieje /etc/bash.bashrc, który jest przeznaczony jako ogólnosystemowy plik rc dla bash, więc można by się spodziewać, że zostanie użyty.

Zobacz także:

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *