Korrigieren der Pfadeinstellung in der Datei ~ / .profile

11

Es gibt eine Zeile, in ~/.profileder

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

Ich bin mir nicht sicher über den letzten i.

  • Soll ich es entfernen?
  • Ist es nicht ein Syntaxfehler?
Lächeln
quelle
4
@ Dessert Ich bin nicht sicher, ob das ein Duplikat ist. Ich bin damit einverstanden, dass es bei beiden um die $PATHUmgebungsvariable geht, aber es handelt sich überhaupt nicht um Duplikate. Sie sind höchstens verwandt. Diese Frage ist ein Problem, bei ~/.profiledem es sich zufällig um ein zusätzliches Zeichen in der Zeile handelt, in der die $PATHUmgebung zugewiesen ist.
Dan
@Dan Die am höchsten bewertete (!) Antwort in der doppelten Frage erklärt, wie eine PATH=Zeile in ~/.profileaussehen sollte, um gültig zu sein - das ist hier die eigentliche Frage.
Dessert
1
@dessert, was das OP hier hat, ist vollkommen gültig, es ist kein Problem eines ungültigen Formats. Das funktioniert, es macht einfach nichts Nützliches.
Terdon
2
Ja, ich benutze den vi-Editor. Möglicherweise habe ich versehentlich das 'i' in die Datei eingefügt, wie der Nachtisch sagte. Aber dann musste ich: wq, um es effektiv zu machen. Ich glaube, ich habe es nicht getan, aber angesichts meines Niveaus hätte ich vielleicht etwas Dummes getan.
Lächeln

Antworten:

13

Nein, es ist kein Syntaxfehler. Es ist nur ein Buchstabe, der nach der Erweiterung von angehängt wird $PATH, weil die Shell Anführungszeichen entfernt ...

$ PATH="$HOME/bin:$HOME/.local/bin:$PATH"i
$ echo $PATH
/home/zanna/bin:/home/zanna/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bini

Es hat also nicht nur lokale Verzeichnisse vorangestellt, sondern auch das vorhandene /snap/binaus meinem PATH entfernt und das nicht vorhandene hinzugefügt /snap/bini.

Sie können das entfernen i, um Ihren Pfad zu reparieren.

Um die Änderung zu sehen, müssen Sie sich abmelden und wieder anmelden oder source ~/.profilein einer von Ihnen verwendeten Shell ausführen (oder die Shell damit starten bash -l), da sie .profilenur von Login-Shells gelesen wird .

Wenn Sie diese Änderung nicht an sich .profileselbst vorgenommen haben, möchten Sie möglicherweise die Standarddatei durch Ausführen wiederherstellen

mv ~/.profile{,.old}
cp /etc/skel/.profile ~/.profile

Dadurch wird die alte umbenannt .profile .profile.old(Sie können die Datei auch löschen, wenn Sie möchten) und durch die Standardversion für Ihr System ersetzt /etc/skel.

Zanna
quelle
5

Ich denke hier ist unklar, was der folgende Ausdruck bedeutet:

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

Der erste Teil PATH=bedeutet, dass wir der (Umgebungs-) Variablen einen neuen Wert zuweisen $PATH.

Der zweite Teil ist der neue Wert dieser Variablen. Im aktuellen Fall wird die Variable $HOMEmit ihrem aktuellen Wert erweitert und an diesen Wert wird die Zeichenfolge angehängt /bin:. Gleiches gilt für den nächsten Teil der Zeichenfolge $HOME/.local/bin:. Schließlich wird der aktuelle (vorherige) Wert der $PATHVariablen erweitert und angehängt. Der Doppelpunkt :spielt eine Rolle als Begrenzer im PATHAusdruck.

Das Ziel ist letztendlich zu schreiben : PATH=<some additional paths>+<the the current value of $PATH>. Wir setzen diese zusätzlichen Pfade vor die Zeichenfolge, da die Shell zuerst an diesen Speicherorten und dann systemweit nach ausführbaren Dateien suchen soll.

Der Charakter iist unnötig. Es wird an den neuen Wert von angehängt $PATHund wird ein Chaos verursachen, wie @Zanna in ihrer Antwort erklärt .

pa4080
quelle
5

Ja, es handelt sich um einen Syntaxfehler. Der tatsächliche Fehler .profilesollte so aussehen, es sei denn, Sie haben Änderungen vorgenommen (dies ist die Version 17.10, siehe Hinweise darunter):

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

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

Dies könnte in älteren Versionen von Ubuntu anders aussehen, in denen die Überprüfung, ob das Benutzerverzeichnis binvorhanden ist, nicht in der enthalten war .profile. Der einfachste Weg, um zu überprüfen, wie es aussehen sollte, ist ein Blick darauf /etc/skel/.profile.

Um hinzuzufügen, wie Sie in Ihrem Kommentar gefragt haben, platzieren Sie dies einfach am Ende Ihrer Profildatei:

# Manual addition for swift development snapshot
export PATH="$PATH:/home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin"

Wenn Sie Ihr Profil jemals komplett durcheinander bringen, gibt es eine Kopie, in der Sie ein neues von in erhalten können /etc/skel/.

Videonauth
quelle
1
Ich habe eine zusätzliche Zeile "export PATH = $ PATH: /home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin", weil ich sie installiert habe. Ist es in Ordnung?
Lächeln
3
Diese Zeile ist in Ordnung. Ich habe sie in mein Beispiel aufgenommen, um zu zeigen, wo sie platziert werden soll.
Videonauth
1
Bitte beachten Sie, dass /etc/skel/.profilein 16.04 anders aussieht, ohne einen Test, ob "$HOME/bin"vorhanden. Auch wenn dies eine bessere Variante (IMO) war, scheint sie bereits in 17.10 geändert worden zu sein - aus einem Grund oder aus Versehen.
Gunnar Hjalmarsson
@GunnarHjalmarsson wird das in meinem Beitrag bemerken, und ja, das ist das Skel / .profile von 17.10, bei dem ich laufe.
Videonauth