Puncte:5

Ubuntu Desktop: De ce scriptul .profile este executat într-un shell interactiv non-login?

drapel kz

Înțeleg diferența dintre Conectare interactivă și Non-login interactiv

Conform acestei postări excelente: Ordinea de încărcare a fișierelor de pornire Zsh/Bash (.bashrc, .zshrc etc.) avem următorul tabel

+----------------+-----------+-----------+------+
| |Interactiv|Interactiv|Script|
| |login |non-login | |
+----------------+-----------+-----------+------+
|/etc/profil | A | | |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc| | A | |
+----------------+-----------+-----------+------+
|~/.bashrc | | B | |
+----------------+-----------+-----------+------+
|~/.bash_profile | B1 | | |
+----------------+-----------+-----------+------+
|~/.bash_login | B2 | | |
+----------------+-----------+-----------+------+
|~/.profil | B3 | | |
+----------------+-----------+-----------+------+
|BASH_ENV | | | A |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
|~/.bash_logout | C | | |
+----------------+-----------+-----------+------+

Primul link se referă la această altă postare excelentă: Curățarea personalizărilor bash unde are la dispoziție o explicație excelentă despre Conectare interactivă și Non-login interactiv după cum urmează:

Un autentificare interactivă shell este un shell în care tastați, acesta este primul astfel de shell pe care îl executați pe mașină. De obicei, va trebui să vă conectați imediat înainte ca shell-ul să înceapă. De exemplu, atunci când trimiteți SSH la un sistem de la distanță și introduceți comenzi în acel sistem, introduceți într-un shell de conectare interactiv.

Un shell interactiv non-login este un nou shell început după ce v-ați autentificat deja; unul care nu necesită să vă conectați din nou. De exemplu, dacă deschideți o nouă fereastră de terminal în interfața grafică de utilizator și primiți un prompt shell, acesta este un shell interactiv non-login. Un alt exemplu de shell interactiv non-login ar fi un sub-shell pornit din interiorul unui editor de text; de exemplu, tastând :sh în vi.

Despre primul, practic se aplică obligatoriu în Ubuntu Server mediu - unde să lucrezi cu fiecare tty este nevoie să faceți o autentificare, deci conform tabelului ~/.profil este folosit (am confirmat că nu există nici ~/.bash_profile nici ~/.bash_login dosare). Se aplică pentru su - alt utilizator (îi cere parola) și, prin urmare, a lui ~/.profil fișierul este și el executat. Până aici sunt bine.

Despre acesta din urmă - motivul acestei postări - Ubuntu Desktop mediu, se aplică atunci când o nouă fereastră/terminal este deschisă cu o singură filă în mod implicit, deci conform tabelului ar trebui să fie executat /etc/bash.bashrc și ~/.bashrc dosare și nu cel .profil fişier

Dar de ce dacă se execută în acea Terminal:

  • echo $JAVA_HOME (definit la .profil)
  • echo $M2_HOME (definit la .profil)
  • echo $GRADLE_HOME (definit la .profil)
  • care java
  • care mvn
  • care gradle

toate comenzile funcționează normal?

Același comportament pentru orice filă nouă (Ctrl + Shift + T) în cadrul aceleiași ferestre și chiar și pentru o nouă fereastră de terminal cu din nou fila sa implicită unică

Am citit urmatoarea postare:

Și nu am setările menționate despre (al doilea este adaptat pentru Ubuntu Desktop 18:04):

  • The .bashrc fișierele nu se referă sau nu fac sursă .profil fişier
  • Editați | × --> Preferințe --> Unamed -> Fila de comandă --> Rulați comanda ca shell de conectare (este nebifat)
raj avatar
drapel cn
raj
Nu shell-ul este cel care execută fișierul `.profile`. Încercați să inserați o comandă precum `echo This is .profile` în fișierul `.profile` - nu veți vedea mesajul pe niciun terminal nou pe care îl deschideți și **ar trebui** să-l vedeți dacă shell-ul se execută efectiv fișierul. Este **mediul dumneavoastră desktop** (GNOME sau altul) care execută acest fișier la pornirea sesiunii. Variabilele de mediu definite acolo sunt apoi moștenite (după cum se spune în răspunsul de mai jos) de **toate procesele** începute din mediul desktop, **inclusiv terminalele**.
Manuel Jordan avatar
drapel kz
@raj Acea logică încalcă/încalcă regulile indicate în tabelul(e) împărtășit(e) în cele două linkuri la întrebarea mea? La prima vedere pare că da - acel comportament se întâmplă în alte distribuții Linux?
raj avatar
drapel cn
raj
Nu, nu face. Logica se referă la **executarea fișierelor de pornire de către shell**. Fișierul `~/.profile` **nu este executat de shell** în acest caz. Deci totul este OK. Mai sus nu s-a spus nimic despre executarea fișierului de către **alt** software decât shell. De asemenea, așa cum s-a spus în primul comentariu la răspuns, este esențial ca fișierul să fie executat de către DE la autentificare, deoarece altfel se vor întâmpla lucruri rele în terminalele pornite din DE (de exemplu, nu ai avea `$PATH` definite corect, deci unele comenzi care funcționează atunci când vă autentificați prin ssh nu vor funcționa din DE).
Puncte:8
drapel cn

Scripturi care sunt executate pentru a shell de conectare (la nivel de sistem /etc/profile, orice script în /etc/profile.d, localul dvs ~/.profil și celelalte fișiere pe care le enumerați) definesc mediul utilizatorului actual - de când v-ați autentificat.

Orice non-login shell-ul pe care îl deschideți ulterior, va moșteni cel puțin mediul shell-ului dvs. de conectare. De aceea aveți (deja) toate variabilele de mediu definite în .profil când deschideți un terminal nou.

drapel cc
Exact, moștenirea este cheia. Din păcate, cu zeci de ani în urmă, oamenii CDE (Common Desktop Environment) nu au primit memoriul, iar terminalele au apărut de pe desktopul lor (și aceeași problemă astăzi pentru mulți DE) nu au primit niciodată mediul dvs. deoarece 1) nu este un termen de conectare și 2 )forked dintr-un proces care nu este al tău, deci moștenirea nu funcționează. Rezultă că atâta porcărie este aruncată în .bashrc. Îngrozitor, deoarece aceste lucruri sunt făcute la fiecare comandă (rulați set -xv și vedeți ce trebuie să execute de fapt bash)
Manuel Jordan avatar
drapel kz
@vanadium Chiar și atunci când răspunsul dvs. este corect - acea logică încalcă/încalcă regulile indicate în tabelul (tabelele) partajat în cele două linkuri de la întrebarea mea? La prima vedere pare că da - acel comportament se întâmplă în alte distribuții Linux?
vanadium avatar
drapel cn
Conform diagramei de flux, fișierele de tip `profil` sunt executate la conectare, indiferent dacă vă conectați pe un TTY (Interactive login shell) sau într-un mediu desktop (non interactiv login shell). De asemenea, se rulează și .bashrc, deoarece provine din profil. După conectare, când deschideți un nou terminal sau un subshell (de exemplu, în TTY) (shell-uri interactive non-login), sunt rulate numai fișierele de tip bashrc.
raj avatar
drapel cn
raj
@vanadium De fapt, pe baza jurnalelor din `/var/log/syslog` cu privire la pornirea sesiunii GNOME, puteți spune că fișierele `/etc/profile` și `~/.profile` (dar **nu** `.bash_profile` ` nici `.bash_login`) sunt obținute în mod explicit de scriptul `/etc/gdm3/Xsession` care este rulat de `gdm-x-session` care este pornit direct de gdm. După aceasta, `dbus-update-activation-environment` este apelat de `gdm-x-session` pentru a exporta mediul către alte procese din sesiune (pornit separat de systemd) prin D-Bus. Deci, acest lucru este destul de complicat, dar nu este implicat niciun shell de autentificare.
vanadium avatar
drapel cn
@ray da, specificul poate fi într-adevăr mult mai complex. Întrebarea aici a fost „de ce .profile a fost executat într-un shell non-login” - răspunsul simplu este - „nu, *nu* se execută. Cu toate acestea, a fost deja executat înainte, așa că îi moșteniți setările în non-login. scoici." .

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.