Ustawiłem zmienną środowiskową za pomocą /etc/profile
:
export VAR=/home/userhome
Jeśli to zrobię, echo $VAR
to pokaże/home/userhome
Ale kiedy umieszczam odniesienie do tej zmiennej w /etc/init.d/servicename
pliku, nie może ona znaleźć tej zmiennej. Gdy uruchamiam service servicename status
przy użyciu /etc/init.d/servicename
pliku o następującej treści:
case "$1" in
status)
cd $VAR/dir
;;
esac
to mówi /dir: No such file or directory
Ale działa, jeśli uruchomię /etc/init.d/servicename status
zamiastservice servicename status
Jak sprawić, by usługa unix widziała zmienne środowiskowe?
rc
skryptu System 5 również nie działa w ten sposób na systemowych systemach operacyjnych, ponieważ wszystkie wywołania skryptu są zamieniane w wywołaniasystemctl
ukrytego haka.Odpowiedzi:
Problem polega na
service
paski wszystkie zmienne środowiskowe, aleTERM
,PATH
iLANG
co jest dobrą rzeczą. Jeśli wykonujesz skrypt bezpośrednio, nic nie usuwa zmiennych środowiskowych, więc wszystko działa.Nie chcesz polegać na zewnętrznych zmiennych środowiskowych, ponieważ podczas uruchamiania zmienna środowiskowa prawdopodobnie nie jest obecna, a Twój system init i tak prawdopodobnie jej nie ustawi.
Jeśli nadal chcesz polegać na takich zmiennych, pobierz plik i odczytaj z niego zmienne, np. Utwórz
/etc/default/servicename
z zawartością:i uzyskaj go ze skryptu init, np .:
źródło
[ ... ]
jest skrótem dla testu warunkowego; zobacz tę odpowiedź .-f
jestif
argumentem sprawdzającym, czy plik istnieje.&&
jest operatorem zwarcia:.
wykonuj drugie polecenie tylko wtedy, gdy pierwsze wyjdzie z 0. operatorem źródłowym lub kropkowym: czytaj i wykonuj polecenia z argumentu nazwa_pliku.-z
jestif
argumentem sprawdzającym ciąg o zerowej długości.>&2
wyślij wyjście do stderr. Zobacz także Wprowadzenie do if .-f
jest częścią[
, a nie częściąif
.[ ... ]
jest skrótem dlatest
polecenia warunkowego ; zobacz tę odpowiedź .-f
Jesttest
argumentem sprawdzającym, czy plik istnieje”.[
(lubtest
) jako o innym poleceniu - wystarczyif
podjąć pewne działania w zależności od statusu wyjścia.$VAR
być w skrypcie inicjującym, muszę być dostępny dla innego programu 2 lub 3 wywołań poniżej skryptu inicjującego. Na przykład. skrypt init wywołuje start-stop-daemon, który wywołuje Program 1 (Java), który wywołuje Program 2, który potrzebuje$VAR
. Próbowałem podstępu w tej odpowiedzi, ale wydaje się, że nie działa ona w mojej sytuacji. Jak mogę się upewnić, że$VAR
będzie dostępny w Programie 2?W moim przypadku potrzebne
RAILS_ENV
, który został ustawiony w/etc/bash.bashrc
:export RAILS_ENV=staging
. Dodałem$(grep RAILS_ENV /etc/bash.bashrc)
i dzięki temu zmienna stała się dostępna dla skryptu. Zrobiłem to w ten sposób, więc nie musiałem dołączać reszty pliku.źródło
Jedno brzydkie rozwiązanie, które będzie działać:
źródło