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?<<<"$-"
, który$-
jest rozszerzany przez powłokę wywołującą z powodu podwójnych cudzysłowów. Wywołana powłoka nie jest interaktywna, ponieważ jej standardowe wejście nie jest tty.exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOF
aby uzyskać to potwierdzenie:$'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'
Tak, tak, możliwa jest nieinteraktywna powłoka logowania i nadal jest ona czytana/etc/profile
. Czy powinniśmy stwierdzić, że WSZYSTKIE powłoki logowania zostały odczytane/etc/profile
?exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF
:).bash
obsługi plików startowych IMO jest dość popsutym, zauważysz, że niektóre systemy załatały go, aby zachować bardziej rozsądne zachowanie, dodając jeszcze więcej zmian.Tak, możliwe są nieinteraktywne powłoki logowania
źródło
su -c 'echo hello' -
. Który, aby sprawdzić, co nam potrzeba, powinien być zapisany jako:su -c 'echo $0 $-; shopt -p login_shell' -
aby uzyskać tę odpowiedź potwierdzającą (zakodowany w cudzysłowie C):$'/etc/profile read \n -su hBc \n shopt -s login_shell'
. Potwierdza to, że nieinteraktywna powłoka logowania została wyliczona i podczas tego procesu odczytano / etc / profile. Dzięki.TAK.
Zauważ jednak, że
/etc/profile
nie byłby używany w przypadku powłoki interakcyjnej, chyba że--login
podany zostanie argument.Typowym idiomem wywołującym nieinteraktywną powłokę logowania jest:
Ale cierpi to na fakt, że
/etc/profile
nie zostanie stracony.Można zmienić to zachowanie, ale wymaga to dostosowania kodu źródłowego Bash w czasie kompilacji poprzez odznaczenie opcji znalezionej w config-top.h :
Kiedy badałem tę
su
anomalię , odkryłem, że inne pociski, w tymzsh
idash
nie mają tej rozbieżności.źródło