Warum ist PATH in ~ / .profile definiert, obwohl das Starten eines Terminals mit bash nur ~ / .bashrc ausführt?

408
Lone Learner

Ich habe ein guestBenutzerkonto auf meinem Debian-System mit XFCE-Desktop.

Es wird ~/.profilestandardmäßig eine Datei hinzugefügt. Die letzten Zeilen dieser Datei sind:

# set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi  echo .profile executed 

Der letzte echoBefehl wird von mir hinzugefügt. Ich habe dafür gesorgt, dass es $HOME/binexistiert.

guest@debian:~$ ls -ld $HOME/bin drwxr-xr-x 2 guest guest 4096 Jan 9 09:42 /home/guest/bin 

Nach dem Booten meines Debian-Systems logge ich mich mit meinem Konto bei meinem XFCE-Desktop ein guestund starte das Terminal (xfce4-terminal). Ich sehe jedoch keine Beweise, ~/.profiledie ausgeführt wurden.

guest@debian:~$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games 

man bashmacht ziemlich klar, dass ~/.profilein einer interaktiven Login-Shell oder einer nicht interaktiven Shell mit der --loginOption gelesen und ausgeführt wird . ~/.bashrcWird in einer interaktiven Nicht-Login-Shell ~/.profileausgeführt. Es scheint also in Ordnung, dass xfce4-terminal nicht gestartet wird, wenn bash gestartet wird.

Wenn ~/.profilenicht ausgeführt wird, wenn wir ein neues Terminal starten, warum wird das PATHUpdate aktualisiert ~/.profile?

Sollte Debian das PATHUpdate nicht bereitstellen ~/.bashrc, damit es für den Benutzer verfügbar ist, wenn der Benutzer ein Terminal startet?

0
In diesem Artikel (https://blog.flowblok.id.au/2013-02/shell-startup-scripts.html) wird erläutert, wann das Startskript ausgeführt wird. Benjamin W. vor 6 Jahren 0
Was meinst du mit * "der in ~ / .profile aktualisierte PATH" *? vor 6 Jahren 0
@EmilyE. Siehe den ersten Codeblock in meiner Frage. Es aktualisiert den vorhandenen (geerbten) "PATH" durch Hinzufügen von "$ HOME / bin" am Anfang von "PATH". Lone Learner vor 6 Jahren 0
Grundsätzlich wird .profile einmal pro * Login * -Sitzung beschafft. Wenn Sie sich von einem Terminal aus anmelden, sehen Sie Ihr Echo. In einer X-Sitzung wird es simuliert - etwas anderes wird diese Datei zum Emulieren von altem Verhalten (einmal für Ihre Sitzung) verwenden. Wenn Sie ein Terminal aus XFCE heraus starten, melden Sie sich nicht erneut an. Auch für bessere "Beweise", warum tun Sie nicht ~ "echo .profile ausgeführt \` Datum \ `>> / tmp / Profil-Treffer". spinkus vor 6 Jahren 0
@spinkus Ich habe diese Zeile zu meinem `~ / .profile` hinzugefügt, mein System neu gestartet, mich bei XFCE angemeldet und ein Terminal gestartet. "/ Tmp / profile-hits" wurde jedoch nicht erstellt, um meine Behauptung zu bestätigen, dass "~ / .profile" zu keinem Zeitpunkt ausgeführt wurde. Ich weiß, wenn ich mich an einem echten Terminal anmelde (`tty1`,` tty2` usw.), wird `~ / .profile` ausgeführt. Ich bin jedoch interessiert zu wissen, warum der `PATH` in` ~ / .profile` neu definiert wird, wenn diese Neudefinition keine Terminalsitzung innerhalb der XFCE-Desktopumgebung beeinflusst. Lone Learner vor 6 Jahren 0
Fragen zu allgemeiner Computerhardware und -software sind für Stack Overflow nicht relevant, es sei denn, sie beinhalten direkt Werkzeuge, die hauptsächlich für die Programmierung verwendet werden. Möglicherweise können Sie Hilfe zu [SU] erhalten. ΔRob vor 6 Jahren 1

4 Antworten auf die Frage

0

~/.profilewird ausgeführt, wenn Sie sich im Konsolenmodus und nicht im GUI-Modus anmelden. Sie können Tasten verwenden, F1, F2 ...um sich im Konsolenmodus anzumelden.

Ihre Antwort ist falsch. `~ / .profile` wird in einer interaktiven Login-Shell als nicht interaktive Shell mit der Option --login ausgeführt. Es hat nichts damit zu tun, ob die Shell in tty oder GUI gestartet wird. Selbst in der GUI können Sie eine interaktive Login-Shell mit dem Befehl `su -` starten und` ~ / .profile` wird ausgeführt. Siehe auch "man bash" für weitere Details. Wie lautet Ihre Antwort auf die eigentliche Frage: Warum ist "PATH" in "~ / .profile" definiert, wenn es nicht in einer interaktiven Nicht-Login-Shell verfügbar sein wird? Lone Learner vor 6 Jahren 3
Danke, dass du mich verbessert hast. Ich habe das gerade durchgearbeitet (https://askubuntu.com/a/279374). Es stellt sich eine ähnliche Frage. Ich persönlich habe darauf keine Antwort. vor 6 Jahren 0
0
Yokai

Edit -> Profile Preferences -> Title and Command -> "Run command as a login shell"

Die üblichen ~/.profileLasten, ~/.bashrcfalls verfügbar, sofern - $BASH_VERSIONin Ihrer Umgebung vorhanden.

Denken Sie daran, dass dies ~/.profileignoriert wird, wenn es ~/.bash_profileoder ~/.bash_loginin Ihrem Zuhause gibt und das als Ergebnis nicht beachtet ~/.bashrcwird.

Diese Antwort wurde von hier bezogen, während ein ähnliches Problem untersucht wurde. In dieser Antwort von Unix & Linux wird erwähnt, wie Debian Shell-Konfigurationen mit Links behandelt, die helfen könnten.

In aktuellen Debian-Standarddateien überprüft `.profile`, ob Bash ausgeführt wird. Wenn ja, wird` .bashrc` geladen. In Bezug auf die Entwicklung der Debian-Entwicklung handelt es sich um eine relativ junge Vereinbarung, die sicherlich nicht auf andere Distributionen verallgemeinert werden kann. tripleee vor 6 Jahren 0
@Yokai Warum definiert Debian also einen benutzerdefinierten "PATH" in "~ / .profile", obwohl er standardmäßig nicht ausgeführt wird, wenn wir Bash in XFCE Terminal starten? Lone Learner vor 6 Jahren 0
0
Bach Lien

Von man bash:

Wenn bash als interaktive Login-Shell oder als nicht interaktive Shell mit der Option −−login aufgerufen wird, werden zuerst Befehle aus der Datei / etc / profile gelesen und ausgeführt, sofern diese Datei vorhanden ist. Nachdem diese Datei gelesen wurde, sucht sie in dieser Reihenfolge nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile und liest und führt Befehle aus dem ersten vorhandenen Befehl aus, der lesbar ist ....

Wenn eine interaktive Shell gestartet wird, die keine Login-Shell ist, liest und führt bash Befehle aus ~ / .bashrc aus, falls diese Datei vorhanden ist.

ich verstehe das

  1. ~/.bashrc: für interaktive Shell
  2. ~/.bash_profile, ~/.bash_login, ~/.profile: Für Login - Shell

Wenn Sie also PATHin Terminal, einer interaktiven Shell, Änderungen PATHvornehmen müssen, sollten Sie diese Einstellungen in setzen ~/.bashrc. oder alternativ können Sie ~/.profilevon ~/.bashrcjeder Quelle aus, die sich nicht in einer Login-Shell befindet, z.

shopt -q login_shell || . ~/.profile 

Was, warum PATHsetzt in wird ~/.profileals empfohlene Art und Weise, wie ich glaube, dass Benutzer definiert PATHsollte richtig eingestellt werden, wenn er / sie Logins und „Login“ kann sein bash, zshoder GUI, oder etwas anderes.

Senario 1: Einige Benutzer möchten möglicherweise nicht-X als Standardarbeitsumgebung verwenden. und X wird aufgerufen, indem es startxnormal oder automatisch ab dem ~/.profileZeitpunkt der Anmeldung des virtuellen Terminals ausgeführt wird tty7.

[ -z $DISPLAY -a $XDG_VTNR -eq 7 ] && exec startx 

In diesem Fall entschieden Benutzer sorgfältig, was in setzen ~/.profile, ~/.bashrcund ~/.xinitrc, so dass sie die gewünschte Menge von Umgebungsvariablen haben --- PATH, EDITOR, VISUAL, BROWSERusw .---, ob er / sie arbeitet in:

  1. Konsolen (Strg + Alt + F [1-6]) oder Anmelden ohne X über ssh: ~/.profile+~/.bashrc
  2. Nicht terminale Programme in X: ~/.profile+~/.xinitrc
  3. Terminalemulatoren in X: ~/.profile+ ~/.xinitrc+~/.bashrc

So Einstellung PATHin ~/.profiledie beste Wahl. Benutzer können festlegen, EDITORwie vimin ~/.profile(in nicht-X), aber es ändern emacsin ~/.xinitrc(in X).

Senario 2: Ein GUI-Benutzer, der sich anmeldet, XFCEanstatt sich als anzumelden bash. so PATHeingestellt werden könnte, ~/.xsessionrcwie hier erläutert .

Senario 3: Ein zshBenutzer kann PATHin ~/.zprofile. Interaktive Einstellungen für bashsind Orte in ~/.bashrcund interaktive Einstellungen für zshwerden platziert ~/.zshrc.

0
Ljm Dullaart

Mein Verständnis war schon immer so, dass .bashrces spezifisch für bash und .profilecross-shell ist. Dies ist möglicherweise kein Problem für die meisten Heimbenutzer, aber ich bin manchmal auf einem System, das Benutzer bevorzugen ksh(und diese Wahl für neue Benutzer durchsetzen). Wenn Sie aus irgendeinem Grund eine Bournshell erhalten, .profilewird sie auch verwendet. Beachten Sie, dass zsh und csh keine .profile verwenden.

Entschuldigung, ich bin verwirrt. Welchen Teil meiner Frage beantworten Sie? Lone Learner vor 6 Jahren 0
Wenn ~ / .profile beim Starten eines neuen Terminals nicht ausgeführt wird, warum wird der PFAD in ~ / .profile aktualisiert? Ljm Dullaart vor 6 Jahren 0