Jaki jest najlepszy sposób na odczytanie pliku konfiguracyjnego w bash?
Na przykład masz skrypt i nie chcesz ręcznie wypełniać całej konfiguracji za każdym razem, gdy wywołujesz skrypt.
Edycja 1: Myślę, że nie wyjaśniłem tego, więc: chcę tylko ... Mam plik konfiguracyjny, który jest podobny
variable_name value
variable_name value ...
i chcę to przeczytać. Wiem, że mogłem po prostu rzucić okiem na argumenty, których szukam ... ale może jest bardziej inteligentny sposób :)
Odpowiedzi:
Jak powiedział mbiber,
source
kolejny plik. Na przykład plik konfiguracyjny (powiedzmysome.config
) to:Twój skrypt może wyglądać następująco:
Wiele plików
/etc/default
zwykle służy jako pliki konfiguracyjne dla innych skryptów powłoki w podobny sposób. Bardzo częstym przykładem zamieszczonych tutaj postów jest/etc/default/grub
. Ten plik służy do ustawiania opcji konfiguracji GRUB-a, ponieważgrub-mkconfig
jest to skrypt powłoki, który go pozyskuje:Jeśli naprawdę musisz przetworzyć konfigurację formularza:
Następnie możesz zrobić coś takiego:
(Możesz także zrobić coś takiego
eval "$var=$value"
, ale jest to bardziej ryzykowne niż pozyskiwanie skryptu. Możesz nieumyślnie złamać to łatwiej niż plik źródłowy.)źródło
=
od samego początku?/etc/default
- i głównie do dobrego użytku. Jeśli twój nieświadomy użytkownik ma dostęp do konfiguracji dla czegoś działającego jako root, jest to już utracona przyczyna.Oczywiście nie jestem
bash
tutaj specjalistą, ale koncepcja nie powinna być inna w żadnym używanym języku:Przykład
W poniższym przykładzie możesz użyć (bardzo) podstawowego skryptu, aby ustawić ciąg lub wydrukować ciąg, zgodnie z ustawieniem w pliku konfiguracyjnym:
Następnie
Aby ustawić ciąg w pliku konfiguracyjnym:
Następnie, aby wydrukować ciąg zdefiniowany w „pliku konfiguracyjnym”:
Oczywiście w prawdziwym skrypcie stosowanym musisz dodać wiele rzeczy, aby upewnić się, że argumenty są poprawne, zdecydować, co zrobić, gdy dane wejściowe są nieprawidłowe, plik ustawień nie istnieje itp.
To jest podstawowy pomysł
źródło
Użyj
source
lub,.
aby załadować plik.lub
Zaleca się również sprawdzenie, czy plik istnieje przed załadowaniem go, ponieważ nie chcesz kontynuować uruchamiania skryptu, jeśli plik konfiguracyjny nie jest obecny.
źródło
Używam tego ...
Plik Conf jest analizowany z sed, a następnie oceniany jako proste przypisanie zmiennej
Najpierw analizowane wartości klucza sed (obsługuje także = otoczony spacjami)
Drugi sed usuwa spacje wokół = znak dla prawidłowego przypisania zmiennej
Można dodać dalsze leczenie
Wszystkie inne niepasujące teksty w pliku conf zostaną usunięte (w tym # lub; komentarz i inne)
Należy pamiętać, że polecenia powłoki jednowierszowej można również oceniać z tego pliku konfiguracyjnego!
źródło
cat
. Dlaczego odwołujesz sięsed
dwa razy jeden po drugim? Możesz połączyćsed
polecenia w następujący sposób:sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g'
sed
polecenie wygeneruje puste dane wyjściowe dla przykładowych wpisów pliku konfiguracyjnego w pytaniu. -1.
przekierowania polecenia i procesu zamiast zmiennych tymczasowych, aby zachować wyniki podprocesu:. <(sed ... "$CFG_FILE")
eval $(sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' "$CFG_FILE")
co jest o wiele lepsze, aby zrozumieć, co się dzieje..
oczekuje pliku, a podstawienie procesu zostanie rozszerzone do pliku.. <(echo echo foo)
działa tak, jak oczekiwano w Bash v4.3.11. W małych przykładach prawdopodobnie nie będzie to miało znaczenia. Wolałbym jednak nie przekazywać wielu kilobajtów przez podstawianie poleceń.źródło