Interpretując ten schemat blokowy
Odkryłem, że w man bash:
Kiedy bash jest wywoływany jako interaktywna powłoka logowania lub jako nieinteraktywna powłoka z opcją --login, najpierw czyta i wykonuje polecenia z pliku / etc / profile, jeśli plik ten istnieje.
Oznacza to, że interaktywne powłoki logowania zostały odczytane /etc/profile
(bez opcji --noprofile)
Również nieinteraktywne powłoki z opcją --login
odczytu/etc/profile
Wydaje się, że pozostawia kilka możliwych powłok logowania (w których $0
zaczyna się od a -
), które nieinteraktywne (uruchamianie skryptu, być może tak proste jak date
) mogą nie czytać (źródło) /etc/profile
.
Aby potwierdzić lub odrzucić ten pomysł:
Najpierw próbowałem użyć su -l -
, który uruchamia powłokę logowania -
jako pierwszy znak, ale nie udało mi się uczynić go nieinteraktywnym (i być w stanie przedstawić testy, aby go sondować).
Wołanie czegoś takiego
$ bash -c 'date' -bash
Nie zgłasza się jako powłoka logowania (nawet jeśli pierwszym znakiem jest a -
).
Spróbuj tego, aby ujawnić szczegóły:
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
$0
Ma-
jako pierwszego znaku, nie mai
(interaktywna) w wartości$-
, ale to nie jest zgłaszane jakologin_shell
(-u). W tym przypadku / etc / profil nie został odczytany, ale nie jestem pewien, czy jest to właściwy test.
Jest też wzmianka o „rzadkich muszli nieinteraktywny login” w tej odpowiedzi nie będąc wystarczająco specyficzne dla tej kwestii.
Zawarcie tego człowieka jest to, że /etc/profile
zawsze czytać.
Przeczytaj tabelę podsumowań: czyta się zarówno interaktywne, jak i nieinteraktywne powłoki logowania /etc/profile
A jeśli przykłady z tej strony są poprawne:
Some examples
$ su bob # interactive non-login shell
$ su - bob # interactive login shell
$ exec su - bob # interactive login shell
$ exec su - bob -c 'env' # non-interactive login shell
$ ssh bob@example.com # interactive login shell, `~/.profile`
$ ssh bob@example.com env # non-interactive non-login shell, `~/.bashrc`
Test przeczytanych exec su - bob -c 'env'
raportów /etc/profile
.
W skrócie:
Czy można mieć nieinteraktywną powłokę logowania (nie wywoływaną przez --login lub -l)?
A jeśli to prawda, czy to czyta /etc/profile
plik?
Jeśli powyższe jest prawdziwe, musimy stwierdzić, że WSZYSTKIE powłoki logowania [interaktywne (lub nie)] czytają / etc / profile (bez --noprofile
opcji).
Uwaga: aby wykryć, że plik / etc / profile jest odczytywany, po prostu dodaj na samym początku pliku następujące polecenie:
echo "'/etc/profile' is being read"
--login
opcji. Po drugie, jeśli tak, toexec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"
dostaję (zakodowane w C qoutes),$'/etc/profile read\nshopt -s login_shell\nbash himBH'
więc jest to login, ale interaktywny. Potrzebujemy loginu i nieinteraktywności . Czego mi brakuje?