Czy istnieje prosty sposób na zamianę / ocenę zmiennych środowiskowych w pliku? Powiedzmy, że mam plik config.xml
zawierający:
<property>
<name>instanceId</name>
<value>$INSTANCE_ID</value>
</property>
<property>
<name>rootPath</name>
<value>/services/$SERVICE_NAME</value>
</property>
...itp. Chcę zastąpić $INSTANCE_ID
w pliku wartością INSTANCE_ID
zmiennej środowiskowej $SERVICE_NAME
wartością SERVICE_NAME
env var. Nie będę z góry wiedział, które zmienne środowiskowe są potrzebne (a raczej nie chcę aktualizować skryptu, jeśli ktoś doda nową zmienną środowiskową do pliku konfiguracyjnego). Dzięki!
shell-script
text-processing
scripting
environment-variables
Robert Fraser
źródło
źródło
Odpowiedzi:
Możesz użyć
envsubst
(częśćgnu gettext
):zastąpi zmienne środowiskowe w twoim pliku odpowiadającą im wartością. Nazwy zmiennych muszą składać się wyłącznie ze znaków alfanumerycznych lub znaków podkreślenia ASCII, nie mogą zaczynać się cyfrą i być niepuste; w przeciwnym razie takie odwołanie do zmiennej jest ignorowane.
Aby zastąpić tylko niektóre zmienne środowiskowe, zobacz to pytanie.
źródło
^[[:alpha:]_][[:alnum:]_]*$
do ustawień narodowych POSIX.To nie jest bardzo miłe, ale działa
Gdyby był w skrypcie powłoki, wyglądałby następująco:
Edycja, druga propozycja:
Edytuj, nie ściśle związane z pytaniem, ale w przypadku zmiennych odczytanych z pliku:
źródło
EOF
, pozostałe wiersze zostaną wykonane przez powłokę jako polecenia. Możemy zmienić separator na coś dłuższego lub bardziej skomplikowanego, ale wciąż istnieje teoretyczna możliwość kolizji. I ktoś mógłby celowo utworzyć plik z separatorem, aby wykonać polecenia."; ls ;"
w pliku ieval
powtórz to polecenie :) Jest to prawie taki sam problem jak w przypadku ataków typu SQL injection. Musisz być bardzo ostrożny podczas mieszania danych z kodem (i takie są polecenia powłoki), chyba że naprawdę , naprawdę jesteś pewien , że nikt nie próbuje zrobić nic, co by zepsuło ci dzień.`"; ls ;"`
- formatowanie komentarzy zjadło backticks. Ale tak naprawdę ten shoule`ls`
tu będzie. Chodzi o to, że zawartość pliku prowadzi do wykonania dowolnego kodu i nic nie możesz na to poradzić.Jeśli zdarzy ci się mieć Perla (ale nie gettext i
envsubst
), możesz wykonać proste zastąpienie krótkim skryptem:Zakładałem, że nazwy zmiennych będą zawierać tylko wielkie litery i podkreślenia, ale pierwszy wzór powinien być łatwy do zmiany w razie potrzeby.
$ENV{...}
odwołuje się do środowiska, które widzi Perl.Jeśli chcesz wesprzeć
${...}
składnię lub rzucić błąd na nieustawione zmienne, będziesz potrzebować trochę więcej pracy. Bliskie odpowiednikiemgettext
„senvsubst
byłoby:Chociaż wydaje mi się, że podawanie takich zmiennych za pośrednictwem środowiska procesowego wydaje się nieco niepewne: w plikach nie można używać dowolnych zmiennych (ponieważ mogą mieć specjalne znaczenie), a niektóre wartości mogą mieć przynajmniej pół- wrażliwe dane w nich zawarte.
źródło
perl -pe 's{\$(\{)?(\w+)(?(1)\})}{$ENV{$2} // $&}ge'
aby zastąpić tylko zdefiniowane zmienne.Czy mogę zasugerować własny skrypt do tego?
https://github.com/rydnr/set-square/blob/master/.templates/common-files/process-file.sh
źródło
Podobnie jak odpowiedź Perla, podstawianie zmiennych środowiskowych może być delegowane do CLI PHP. Zależność od PHP może, ale nie musi być akceptowalna, w zależności od stosu technologii.
Możesz pójść dalej i umieścić go w skrypcie wielokrotnego użytku, na przykład
envsubst
:Wykorzystanie byłoby:
źródło