Chcę wywołać plik ustawień dla zmiennej, jak mogę to zrobić w bash?
Zatem plik ustawień będzie definiował zmienne (np .: PLIK KONFIGURACJI):
production="liveschool_joe"
playschool="playschool_joe"
A skrypt użyje w nim tych zmiennych
#!/bin/bash
production="/REFERENCE/TO/CONFIG.FILE"
playschool="/REFERENCE/TO/CONFIG.FILE"
sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
Jak mogę zmusić bash do zrobienia czegoś takiego? Czy będę musiał używać awk / sed etc ...?
źródło
source
przez potokowanie zawartości zamiast dostarczania pliku? Jaksome command | source
nie działa ...declare -p
), tak by wyglądałosomeArray[3]="abc"
, i tak dalej ...jeszcze krócej za pomocą kropki:
źródło
source
polecenia, aby było jasne?Użyj
source
polecenia, aby zaimportować inne skrypty:źródło
Mam ten sam problem szczególnie w przypadku bezpieczeństwa i tutaj znalazłem rozwiązanie .
Mój problem polegał na tym, że chciałem napisać skrypt wdrożeniowy w bash z plikiem konfiguracyjnym, który zawiera taką ścieżkę jak ta.
Istniejące rozwiązanie polega na użyciu polecenia „SOURCE” i zaimportowaniu pliku konfiguracyjnego z tymi zmiennymi. „ŹRÓDŁOWA ścieżka / do / pliku” Ale to rozwiązanie ma pewien problem z bezpieczeństwem, ponieważ plik źródłowy może zawierać wszystko, co może zawierać skrypt Bash. To stwarza problemy z bezpieczeństwem. Osoba malicicios może „wykonać” dowolny kod, gdy skrypt pozyskuje swój plik konfiguracyjny.
Wyobraź sobie coś takiego:
Aby rozwiązać ten problem, możemy chcieć zezwolić tylko na konstrukcje w formie
NAME=VALUE
w tym pliku (składnia przypisania zmiennych) i być może komentarze (chociaż technicznie komentarze są nieważne). Możemy więc sprawdzić plik konfiguracyjny za pomocąegrep
odpowiednika poleceniagrep -E
.W ten sposób rozwiązałem problem.
źródło
CMD="$(rm -fr ~/*)"
.(
i `` finałCONFIG_SYNTAX="(^\s*#|^\s*$|^\s*[a-z_][^[:space:]]*=[^;&\(`]*$)"
foo=bar unleash_virus
można wykonać. Uwagafoo=bar\ unleash_virus
,foo="bar unleash_virus"
ifoo=bar #unleash_virus
są bezpieczne. Nie jest łatwo prawidłowo oczyścić i tak nie blokować jakiejś nieszkodliwej składni, zwłaszcza gdy myślisz o każdym możliwym cytowaniu i ucieczce.w Bash, aby pobrać dane wyjściowe polecenia, zamiast pliku:
odniesienie
źródło
Konwersja pliku parametrów na zmienne środowiskowe
Zwykle zajmuję się analizowaniem zamiast pozyskiwaniem, aby uniknąć złożoności niektórych artefaktów w moim pliku. Oferuje mi również sposoby specjalnego traktowania cytatów i innych rzeczy. Moim głównym celem jest zachowanie literału po znaku „=”, nawet podwójnych cudzysłowów i spacji.
Zwróć uwagę na małą sztuczkę, którą musiałem zrobić, aby potraktować mój cytowany tekst jako pojedynczy parametr ze spacją do mojej
cntpars
funkcji. Wymagany był jeden dodatkowy poziom oceny. Gdybym tego nie zrobił, jak w Opcji 2, przekazałbym 2 parametry w następujący sposób:"value
content"
Podwójne cudzysłowy podczas wykonywania polecenia powoduje zachowanie podwójnych cudzysłowów z pliku parametrów. Dlatego trzecia opcja również zawodzi.
Inną opcją byłoby oczywiście po prostu nie podawanie zmiennych w podwójnych cudzysłowach, jak w opcji 4, a następnie po prostu upewnienie się, że w razie potrzeby zacytujesz je.
Tylko coś do zapamiętania.
Wyszukiwanie w czasie rzeczywistym
Inną rzeczą, którą lubię robić, jest wyszukiwanie w czasie rzeczywistym, unikając użycia zmiennych środowiskowych:
Nie jest to najbardziej wydajne, ale przy mniejszych plikach działa bardzo czysto.
źródło
Jeśli zmienne są generowane i nie są zapisywane w pliku, nie można ich przesłać potokowo
source
. Pozornie prosty sposób na zrobienie tego jest następujący:źródło
Skrypt zawierający zmienne można wykonać zaimportować za pomocą basha. Rozważmy skrypt-variable.sh
Rozważ rzeczywisty skrypt, w którym zmienna będzie używana:
źródło
src-var
jest też prawidłowym identyfikatorem.Aby zapobiec konfliktom nazw, importuj tylko te zmienne, których potrzebujesz:
źródło