Fish-shell: Wie setze ich $PATH dauerhaft?

Erstellt am 18. Jan. 2013  ·  58Kommentare  ·  Quelle: fish-shell/fish-shell

Um dauerhaft an $PATH anzuhängen:

 set -Ua fish_user_paths /path/to/add

Führen Sie dies nur einmal aus, fügen Sie es nicht in ein Startskript ein.

Wenn Sie es in ein Startskript einfügen möchten, verwenden Sie dieses Formular, um zu verhindern, dass die Variable für immer wächst:

contains /path/to/add $fish_user_paths; or set -Ua fish_user_paths /path/to/add

Top-Kommentar von @ridiculousfish entführt, um Leuten zu helfen, von Suchmaschinen hierher zu gelangen. Originalkommentar folgt:


Ich probiere set -U PATH ~/.cabal/bin $PATH aus, was es in der Shell festlegt, in die ich es eingebe, aber keine neuen Shells, die ich starte, und es ist weg, wenn ich auch die erste Shell neu starte.

Verwenden von git HEAD auf Fedora 18.

Hilfreichster Kommentar

Ich denke, das liegt daran, dass die PATH-Variable in Fish speziell behandelt wird. Sie können es also nicht universell machen usw. Die Gründe dafür sind mir nicht bekannt. Vielleicht möchte @ridiculousfish oder @JanKanis ein paar Worte dazu sagen.

Unter Linux setze ich PATH in ~/.config/fish/config.fish auf diese Weise:

set -gx PATH /opt/qt/Tools/QtCreator/bin /opt/qt/5.0.0/gcc_64/bin $PATH

Alle 58 Kommentare

Ich denke, das liegt daran, dass die PATH-Variable in Fish speziell behandelt wird. Sie können es also nicht universell machen usw. Die Gründe dafür sind mir nicht bekannt. Vielleicht möchte @ridiculousfish oder @JanKanis ein paar Worte dazu sagen.

Unter Linux setze ich PATH in ~/.config/fish/config.fish auf diese Weise:

set -gx PATH /opt/qt/Tools/QtCreator/bin /opt/qt/5.0.0/gcc_64/bin $PATH

PATH ist normalerweise eine globale Variable, die erstellt wird, wenn fish von der Umgebungsvariable in seiner Umgebung startet. Wenn Sie set -U PATH <something> ausführen, wird eine universelle Variable PATH erstellt, aber die universelle wird von der globalen überschattet, sodass Sie sie nicht sehen. Es könnte funktionieren, wenn Sie set -eg PATH ausführen (das globale PATH löschen) und Sie auch das -x -Flag angeben müssen, wenn Sie den universellen PATH erstellen ( set -Ux PATH <something> ). Aber wenn Sie zB ein neues X-Terminal ausführen, findet der Fisch darin wieder ein PATH in seiner Umgebung, also erzeugt er wieder ein globales PATH . Ich würde empfehlen, dass Sie Ihren Weg festlegen, indem Sie es tun

set PATH <mydir> $PATH

in Ihren config.fish , sodass es jedes Mal ausgeführt wird, wenn fish startet. Das ändert nur das bestehende globale PATH .

Ah. Ich habe mich nur gefragt, ob es eine ordentlich interaktive / "live" -Methode gibt, dies zu tun.

config.fish lebt (standardmäßig) in ~/.config/fish/config.fish , und das ist es auch
in der Benutzerdokumentation erwähnt. (Aber vielleicht sollte es deutlicher gemacht werden).
Es gibt auch vared zum interaktiven Bearbeiten von Variablen (allerdings nur
arbeitet jeweils an einem Array-Element).

Am 18. Januar 2013 um 21:07 Uhr schrieb Dag Odenhall [email protected] :

Ah. Ich habe mich nur gefragt, ob es einen sauber interaktiven / "live" -Weg gibt
Tu es. config.fish scheint auch nicht dokumentiert zu sein, also war ich es
Ich frage mich, ob es überhaupt eine solche Datei gibt.


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHubhttps://github.com/fish-shell/fish-shell/issues/527#issuecomment -12438806 an.

Ja, ich habe auf der falschen Seite gesucht. Ich habe diesen Kommentar bearbeitet, aber github hat die E-Mail-Benachrichtigung schneller gesendet.

Wenn fish startet, ändert es PATH, um sein bin-Verzeichnis einzuschließen. Wir möchten den Benutzern wirklich mitteilen, dass sie PATH über set -U dauerhaft ändern können. Wir wollen also einen zweistufigen PATH - was fish lokal zur aktuellen Sitzung hinzufügt und auch was der Benutzer angibt, universell für alle Sitzungen.

Da das Setzen von $PATH sehr verbreitet ist, denke ich, dass es wichtig ist, eine Story für Fish 2.0 zu haben, die nicht erfordert, dass der Benutzer config.fish bearbeitet. Es ist jedoch gefährlich, es einfach universell zu machen, da Fische verlagert werden können. Wenn fish von /usr/local/bin und auch von ~/github/fish/ ausgeführt wird, möchten wir zulassen, dass diese Instanzen unterschiedliche PATHs haben, da sie unterschiedliche $__fish_bin_dir s haben. Andererseits möchten wir dem Benutzer auch ermöglichen, eines dieser bin-Verzeichnisse direkt anzugeben.

Hier ist, was ich denke:

  1. Eine Variable $fish_user_paths , die universell sein wird. Wir empfehlen dem Benutzer, es einzustellen.
  2. Eine Variable $fish_default_paths , die global (pro Prozess) ist und in share/config.fish gesetzt wird. Es wird mindestens $__fish_bin_dir haben, was das bin-Verzeichnis von Fish ist.
  3. $PATH wird global sein und exportiert.
  4. Es wird einen Event-Handler geben, der auf Änderungen an $fish_user_paths achtet und $PATH wie folgt aktualisiert:

Funktion __fish_update_path --on-event path-var-changed
set -gx PFAD $fish_user_paths $fish_default_paths
Ende

vielleicht mit etwas Uniqueing, um Duplikate zu vermeiden.

Mit diesem Design dann:

  1. Das Festlegen von PATH in config.fish funktioniert weiterhin, es sei denn, es ändert sich etwas $fish_user_paths , was fish niemals alleine tun wird.
  2. Um einen Pfad universell zu PATH hinzuzufügen, setzen Sie $fish_user_paths.

Ich bin nicht sehr zufrieden damit, weil es drei Variablen erfordert - es wäre schön, wenn es einen Ansatz gäbe, der nur $PATH benötigt. Gedanken?

Eine andere Option, die mir in den Sinn kam (obwohl ich nicht unbedingt dafür bin
es, nur als eine weitere Option auflisten): Lassen Sie die Einschränkung fallen, die $PATH kann
nur gültige Verzeichnisse enthalten, dann universell machen. Auf diese Weise ein Benutzer
könnte einfach alle Verzeichnisse hinzufügen, die möglicherweise benötigt werden. Hm, am zweiten
dachte, Fisch braucht auch die Option, sein eigenes Bindir zu PATH hinzuzufügen,
ohne Benutzereinstellungen zu vermasseln, also bringt das meine Gedanken zu a
Lösung, die einen vom Benutzer einstellbaren Pfad und einen vom Fisch einstellbaren Pfad enthält, iow
so etwas wie du vorschlägst.

Eine andere Designentscheidung könnte darin bestehen, $fish_user_paths in universal umzubenennen
$PATH, und beschatten Sie es durch ein globales $PATH, das würde eine Variable speichern, aber es ist
wahrscheinlich verwirrender für Benutzer, also nicht wirklich wert.

Am 8. Februar 2013 um 23:17 Uhr schrieb ridiculousfish [email protected] :

Da das Setzen von $PATH sehr verbreitet ist, denke ich, dass es wichtig ist, einen zu haben
Story für Fish 2.0, die den Benutzer nicht dazu auffordert, config.fish zu bearbeiten.
Es ist jedoch gefährlich, es einfach universell zu machen, weil Fisch es ist
verschiebbar. Wenn Fisch von /usr/local/bin und auch von ausgeführt wird
~/github/fish/, möchten wir zulassen, dass diese Instanzen unterschiedliche PATHs haben
weil sie unterschiedliche $__fish_bin_dirs haben. Andererseits wir auch
dem Benutzer erlauben möchten, eines dieser bin-Verzeichnisse direkt anzugeben.

Hier ist, was ich denke:

  1. Eine Variable $fish_user_paths, die universell sein wird. Wir ermutigen
    der Benutzer, um es einzustellen.
  2. Eine Variable $fish_default_paths, die global (pro Prozess) sein wird,
    und das wird in share/config.fish gesetzt. Es wird mindestens haben
    $__fish_bin_dir, das bin-Verzeichnis von fish.
  3. $PATH wird global sein und exportiert.
    4.

Es wird einen Ereignishandler geben, der auf Änderungen an überwacht
$fish_user_paths und aktualisiert $PATH wie folgt:

Funktion __fish_update_path --on-event path-var-changed
set -gx PFAD $fish_user_paths $fish_default_paths
Ende

vielleicht mit etwas Uniqueing, um Duplikate zu vermeiden.

Mit diesem Design dann:

  1. Das Festlegen von PATH in config.fish funktioniert weiterhin, es sei denn, etwas
    ändert $fish_user_paths, was Fish niemals alleine tun wird.
  2. Um einen Pfad universell zu PATH hinzuzufügen, setzen Sie $fish_user_paths.

Ich bin nicht sehr zufrieden damit, weil es drei Variablen erfordert - it
wäre schön, wenn es einen Ansatz gäbe, der nur $PATH benötigt. Gedanken?


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHubhttps://github.com/fish-shell/fish-shell/issues/527#issuecomment -13315434 an.

Einen universellen PATH zu haben, der sich einfach ansammelt, scheint harmlos. Ein weiterer Gedanke, den ich hatte, war, zu versuchen, Fische zu reparieren, damit sie nicht von PATH abhängen, um ihre eigenen Binärdateien zu finden. Dann müsste PATH überhaupt nicht geändert werden.

Mir fällt auf, dass PATH niemals eine universelle Variable sein sollte, weil sie von der Umgebung geerbt werden muss. Das heißt, wenn jemand PATH in bash setzt und dann fish aufruft, sollte fish das respektieren und es nicht mit einem universellen Wert überschreiben.

Hier ist, was ich am Ende getan habe:

  1. fish modifiziert PATH nicht mehr für seine eigenen Zwecke. Es weiß, wie es seine eigenen Binärdateien (wie fish_indent) ohne PATH findet.
  2. Variable $fish_user_paths eingeführt. Wenn Sie fish_user_paths ändern, wird eine kleine Funktion (definiert in share/config.fish) ausgeführt, die die gleichen Änderungen an PATH durchführt. fish_user_paths soll universell sein.

Das ist also meinem Vorschlag ähnlich, außer dass wir fish_default_paths nicht brauchen. Und ich finde die Trennung zwischen „hier ist Zeug aus der Umwelt“ und „hier ist Zeug zum Hinzufügen“ gut. Ich finde es auch gut, dass keine Änderungen an fish selbst erforderlich waren, nur an config.fish.

Um also dauerhaft an PATH anzuhängen, hängen Sie an fish_user_paths an, z. B. set -U fish_user_paths ~/bin . Ich habe auch einen Hinweis in der Dokumentation hinzugefügt.

An [email protected]:fish-shell/fish-shell.git
2f43584..d3e9183 Meister -> Meister

Gibt es einen Grund, warum wir PATH nicht voranstellen , anstatt etwas anzuhängen? Auf diese Weise hat die Verwendung von festgelegten Pfaden Vorrang, was mein gewünschter Anwendungsfall ist, zumindest für Homebrew ( /usr/local/bin ).

In Fisch 2.1 stellen wir voran.

@saulshanabrook : Bereits mit Ausgabe Nr. 888 behoben.

Jedenfalls denke ich, dass universelles PATH möglich sein könnte, wenn das PATH nur als Hinweis betrachtet würde. Alle Verzeichnisse in PATH würden zu PATH hinzugefügt, die von der Umgebung empfangen wurden, es sei denn, sie existieren bereits. Wenn Sie es also nicht wirklich versuchen würden, würden Sie keinen Fisch brechen.

Dass PATH nicht einfach durch eine normale Benutzeraktion geändert werden kann, ist ein großes Problem und steht im Gegensatz zu der schönen Einfachheit von fish im Vergleich zu anderen Shells. Bitte beheben Sie dies. Es ist wirklich ein königlicher Schmerz. Ich möchte den Pfad festlegen und ihn von da an zumindest in der aktuellen Sitzung, wenn nicht überall, zum Laufen bringen. Weißt du, was für eine Überraschung das ist
set -U PATH $PATH mein_Pfad
ergibt einen unveränderten $PATH? Es ist lächerlich.

Ein Teil der Überraschung beruht auf der Tatsache, dass Sie universelle Variablen setzen und sie ohne Vorwarnung von globalen Variablen überschreiben lassen können; Vielleicht sollten wir zumindest im interaktiven Modus warnen, wenn wir eine globale oder universelle Variable setzen, für die eine Variable mit spezifischerem Geltungsbereich und demselben Namen festgelegt ist. Dies hat auch andere Variablen gebissen, wie zum Beispiel $TERM in #806.

EDIT: Mir ist gerade aufgefallen, dass dies oben erwähnt wurde.

Wenn Sie nur den Pfad für die aktuelle Sitzung festlegen möchten, lassen Sie den Bereich weg und führen Sie einfach set PATH $PATH my_path aus. Dies verwendet den Bereich, der von dieser Sitzung verwendet wird, in diesem Fall global.

Wenn Sie dauerhaft Pfade hinzufügen möchten, tun Sie dies, indem Sie fish_user_paths manipulieren. Dies ist eine universelle Variable, set fish_user_paths $fish_user_paths my_path .

Wenn ich etwas in $fish_user_paths wie /usr/local/bin einstelle, das auch durch einen Eintrag in /etc/paths unter OS X hinzugefügt wird, wird /usr/local/bin auf $PATH nicht erweitert

@ridiculousfish , die in Fisch 2.1 angegeben sind, werden Werte von $fish_user_paths $PATH vorangestellt, aber es sieht so aus, als ob dies nur passiert, wenn der hinzugefügte Pfad "neu" ist, wenn er bereits existiert, bleibt er bestehen.

Dies verursacht ein etwas verrücktes Verhalten auf meinem System, da which pip jetzt /usr/local/bin/pip von meiner Homebrew-Python-Installation zurückgibt, aber which python /usr/bin/python zurückgibt, die OS X-Python-Installation.

Das Brew-Plugin in bpinto/oh-my-fish behebt es zwar aber immer noch.

_Korrektur_

Der Handler für fish_user_paths legt $fish_user_paths nicht als universell fest .
Der richtige Weg, um dauerhaft einen Pfad zu Ihrem $PATH (AFAIK) hinzuzufügen, wäre

set --universal fish_user_paths $fish_user_paths ~/path/name

_Originalbeitrag_

Nachdem ich etwas gelesen und herumgespielt habe, um herauszufinden, wie Sie Ihrem $PATH dauerhaft einen Pfad hinzufügen können, denke ich, dass der Vorschlag von @terlar am besten ist. Das ist

set fish_user_paths $fish_user_paths my_path
  • Die Angabe des Flags -U/--universal wie in set -U fish_user_paths $fish_user_paths my_path scheint überflüssig zu sein.
  • Das Weglassen von $fish_user_paths , wie es an einigen Stellen zu sehen ist, scheint Ihren letzten Pfad zu überschreiben, wenn Sie diesen Befehl zweimal mit unterschiedlichen Pfaden ausführen:

    set -U fish_user_paths path1
    set -U fish_user_paths path2
    
  • Das Setzen von $PATH auf jeder Shell-Instanz (z. B. durch Einfügen von set PATH $PATH my_path in Ihr config.fish ) ist weniger effizient als eine universelle Variable, die Sie einmal setzen.
# NOTE: There is probably a sexier nicer way to do this, but until I figure that out I am manually unsetting here.
# Unsets PATH
set -g -x PATH

# This allows us to use Homebrew versions of things (like git) rather than the pre-installed or XCode installed versions.
# See http://blog.grayghostvisuals.com/git/how-to-keep-git-updated/ for reference.
set -g -x PATH $PATH /usr/local/bin

# Sets necessary PATH defaults
set -g -x PATH $PATH /usr/bin /bin /usr/sbin /sbin

Vielen Dank @dideler , Folgendes funktioniert gut, um rvm erneut hinzuzufügen:

set --universal fish_user_paths $fish_user_paths ~/.rvm/bin

Hm, nun, ich habe gerade set --universal fish_user_paths $fish_user_paths ~/plan9/bin gemacht und bin mit einem kaputten System gelandet :P, also ist es nicht immer das Richtige, $PATH voranzustellen.

@timthelion : Inwiefern kaputt? Hast du es interaktiv oder über config.fish (oder ähnlich) hinzugefügt? (Ich frage, weil das bedingungslose Anhängen an universelle Variablen dazu führt, dass sie explodieren.)

Oder überschattet Ihr Plan9-Zeug nur etwas? Wie zB hat es ein inkompatibles "grep"?

Ja, es beschattet fast alles, aber es hat auch zusätzliche Befehle, wie venti und vac ...

[00:06:26] timothy@timothy-debian-hp /home/timothy/plan9/bin (0)                          
> ls
"*           codereview.py*  gif*         ndbmkhosts*    rsagen*     tr*
""*          colors*         grap*        ndbquery*      sam*        tr2post*
9*           comm*           graph*       netfileget*    samsave*    tref*
9660srv*     core*           grep*        netfilelib.rc  samterm*    troff*
9a*          crop*           gunzip*      netfileput*    scat*       troff2html*
9ar*         date*           gview*       Netfiles*      secstore*   troff2png*
9c*          db*             gzip*        netfilestat*   secstored*  tweak*
9fs*         dc*             hget*        netkey*        secuser*    u*
9import*     dd*             hist*        news*          sed*        unicode*
9l*          delatex*        hoc*         nobs*          seq*        uniq*
9p*          deroff*         htmlfmt*     nroff*         sftpcache*  units*
9pfuse*      devdraw*        htmlroff*    osxvers*       sha1sum*    unmount*
9pserve*     dial*           ico*         p*             sig*        unutf*
9.rc*        dict*           iconv*       page*          slay*       unvac*
9term*       diff*           idiff*       passwd*        sleep*      unzip*
acid*        disk/           img*         pbd*           sort*       upas/
acidtypes*   disknfs*        import*      pemdecode*     spell*      u.rc*
acme*        dns*            ipso*        pemencode*     split*      usage*
acmeevent*   dnsdebug*       join*        pic*           sprog*      vac*
adict*       dnsquery*       jpg*         plot*          src*        vacfs*
aescbc*      dnstcp*         kill*        plumb*         srv*        vbackup*
ascii*       doctype*        label*       plumber*       ssam*       vcat*
asn12dsa*    dsa2pub*        lc*          png*           ssh-agent*  venti/
asn12rsa*    dsa2ssh*        lex*         ppm*           stack*      vmount*
astro*       dsagen*         listen1*     pr*            start*      vmount0*
auxclog*     dsasign*        look*        primes*        stats*      vnfs*
auxstats*    du*             lookman*     proof*         statusbar*  vwhois*
awd*         dump9660*       lpbin/       ps*            stop*       wc*
awk*         E*              ls*          psdownload*    strings*    web*
B*           echo*           Mail*        psfonts*       sum*        win*
basename*    ed*             man*         psu*           tail*       wintext*
bc*          eqn*            mapd*        psv*           tar*        wmail*
bmp*         factor*         mc*          ramfs*         tbl*        xd*
bundle*      factotum*       md5sum*      rc*            tcolors*    xshove*
bunzip2*     file*           mk*          read*          tcs*        yacc*
bzip2*       fmt*            mk9660*      readcons*      tee*        yesterday*
cal*         fortune*        mkdir*       resample*      test*       yuv*
calendar*    fossil/         mklatinkbd*  rio*           time*       zerotrunc*
cat*         freq*           mount*       rm*            togif*      zip*
cb*          fs/             mtime*       rsa2csr*       toico*
cleanname*   fsize*          namespace*   rsa2pub*       topng*
cmapcube*    g*              ndbipquery*  rsa2ssh*       toppm*
cmp*         Getdir*         ndbmkdb*     rsa2x509*      touch*
codereview*  getflags*       ndbmkhash*   rsafill*       tpic*

Verstehst du jetzt was ich mit kaputt meine ;)

Verstehst du jetzt was ich mit kaputt meine ;)

Jawohl. Und in diesem Fall ist das Voranstellen von PATH _definitiv_ das Falsche (wie Sie gesagt haben), aber ich bin mir nicht sicher, ob das Anhängen viel besser ist. Natürlich wäre es schön zu wissen, was kaputt geht, vielleicht können wir es beheben - auf welches Verhalten verlassen wir uns, das die plan9-Tools nicht implementieren? Ich nehme an, wenn sie etwas "mkdir" nennen, werden Verzeichnisse erstellt, aber es muss nicht unbedingt eine "-p" -Option haben.

Meine Kopie der Manpage plan9port Intro rät jedoch ausdrücklich davon ab, $PATH voranzustellen.

Es unterstützt mkdir -p , was das häufigste Ergebnis ist, wenn der Quellbaum für system( gruppiert wird, rm -Rf ist das andere und das würde als rm von plan9 fehlschlagen -r angegeben wird. Beide werden nur in den Tests verwendet, spielen also möglicherweise keine Rolle. Natürlich kann die Brüchigkeit in der Bibliothek von .fish Shell-Skripten sehr groß sein.

Nun, ich denke, dass diese Dienstprogramme in plan9port bereitgestellt werden, damit historische rc-Shell-Skripte (plan9s eigene Shell) funktionieren können. Offensichtlich wird Fish niemals mit diesen alten Plan9-Shell-Skripten kompatibel sein (will es nicht einmal sein). Es gibt also keinen Grund, auf diese alten Dienstprogramme zuzugreifen. Das bedeutet jedoch nicht, dass eine Person niemals plan9-Dienstprogramme verwenden möchte, die nicht in GNU posix oder BSD vorhanden sind ... Also ist es für plan9port meiner Meinung nach am besten, an den Pfad anzuhängen und nicht stell es voran. Ich verstehe jedoch, dass es unvernünftig wäre, das Verhalten von $fish_user_paths nur für plan9port zu ändern ;). Daher war mein Kommentar eher von Interesse. Am Ende habe ich die entsprechenden Befehle in ~/.config/fish/config.fish .

Wie können Sie fish_user_paths in gemeinsam genutzten Punktdateien festlegen? Sollte ich stattdessen nur $PATH verwenden?

@nhooyr : Sie könnten $PATH verwenden oder hinzufügen

if not set -q fish_user_paths[1]
    set -U fish_user_paths SOMEVAL
end

Davon abgesehen sollten wir wahrscheinlich einfach den Host-Teil aus dem Variablenspeicher entfernen. Dies ist mindestens das dritte Mal in der letzten Woche, dass dies vorgekommen ist.

@faho hat die Verwendung fish_user_paths einen Vorteil für mich?

@nhooyr : Das Schöne an universellen Variablen ist, dass Sie sie setzen und vergessen können. Benötigen Sie eine weitere Komponente in $PATH? Führen Sie einmal set fish_user_paths $fish_user_paths /some/path aus und Sie sind fertig. Es wird sogar mit jeder aktuell laufenden Shell auf diesem Rechner synchronisiert.

Da der Store derzeit nicht einfach in Git gespeichert und auf mehreren Computern verwendet werden kann, verliert er natürlich ein wenig von seiner Nützlichkeit, und ich setze sie aus diesem Grund alle über eine Konfigurationsdatei.

@faho Also kein Vorteil für mich im Moment, weil ich maschinenübergreifend synchronisieren muss. Könnte dann auch $PATH verwenden. Danke!

Ich bin hierher gekommen, um herauszufinden, wie ich Cabal for Haskell mit Fisch einrichten kann.

Was ist der Unterschied zwischen:

set --universal fish_user_paths $fish_user_paths ~/.cabal/bin

und

set fish_user_paths $fish_user_paths ~/.cabal/bin

Es ist der Unterschied zwischen set und set --universal , der hier dokumentiert ist: https://fishshell.com/docs/current/commands.html#set

-U oder --universal bewirkt, dass die angegebene Shell-Variable einen universellen Gültigkeitsbereich erhält. Wenn diese Option angegeben wird, wird die Variable von allen Fischinstanzen des aktuellen Benutzers auf dem aktuellen Computer gemeinsam genutzt und über Neustarts der Shell hinweg beibehalten.

Da in diesem Fall fish_user_paths bereits als universelle Variable definiert ist (und nicht explizit in einem anderen Gültigkeitsbereich geschattet wird), ist set fish_user_path ... so, als ob derselbe Gültigkeitsbereich wie die vorhandene Variable angewendet würde ihnen (also ein implizites --universal ).

@thekyriarchy : Sie sollten sich die Fish-Dokumentation zu "Shell-Variablen" ansehen - insbesondere den Abschnitt "Variablenbereich" (der in der set -Dokumentation wiederholt wird).

Kurz gesagt: Ersteres setzt explizit die universelle Variable. Wenn das nicht existiert, erstellt es es. Wenn dies der Fall ist, wird sie geändert - selbst wenn eine Variable mit demselben Namen in einem anderen Gültigkeitsbereich vorhanden ist.

Letzteres ändert entweder die vorhandene Variable im niedrigsten Gültigkeitsbereich (der lokal, global oder universell sein kann - in dieser Reihenfolge) oder es könnte eine funktionsbezogene Variable erstellen.

Es gehört zum guten Ton, den Geltungsbereich explizit anzugeben, daher würde ich Ersteres empfehlen.

Ich habe es sowohl mit als auch ohne --universal versucht, aber so oder so scheint es nach Neustarts nicht erhalten zu bleiben.

@thekyriarchy : Was ist dein Setup? Betriebssystem? Fischversion? Was sind die Werte von $HOME und $XDG_CONFIG_HOME?

Wenn Sie direkt nach dem Fischen echo $fish_user_paths eingeben, was wird ausgegeben?

@thekyriarchy , Welche Fischversion verwendest du? Was geben die folgenden Befehle aus:

echo $HOME
ls -ld $HOME/.config/fish
ls -l $HOME/.config/fish
echo $XDG_CONFIG_HOME
ls -ld $XDG_CONFIG_HOME/.config/fish
ls -l $XDG_CONFIG_HOME/.config/fish
set -U | grep fish_user_paths
set -g | grep fish_user_paths
set -l | grep fish_user_paths
set -U | grep PATH
set -g | grep PATH
set -l | grep PATH

Alternativlösung dank Google Cloud SDK:

Legen Sie die Datei path.bash.inc in den Ordner, den Sie hinzufügen möchten, z. B. den Ordner ~/go:

script_link="$( command readlink "$BASH_SOURCE" )" || script_link="$BASH_SOURCE"
apparent_sdk_dir="${script_link%/*}"
if [ "$apparent_sdk_dir" == "$script_link" ]; then
  apparent_sdk_dir=.
fi
sdk_dir="$( command cd -P "$apparent_sdk_dir" > /dev/null && command pwd -P )"
bin_path="$sdk_dir/bin"
export PATH=$bin_path:$PATH

Beachten Sie, dass dies den Ordner /bin anhängt, es ist eigentlich eine gute Praxis, Execs in einem Ordner namens bin abzulegen.

Fügen Sie in der Fischkonfiguration die Zeile hinzu:

bass source '/Users/yourUser/go/path.bash.inc'

Das ist schön, funktioniert überall

Nur eine Warnung an alle hier, ich wurde von diesem Problem gebissen, also möchte ich es teilen

set fish_user_paths $fish_user_paths /some/path

Wenn Sie dies tun, wird Ihr Fischkonfigurations-Cache jedes Mal größer, wenn Sie Ihr Terminal öffnen. In meinem Fall wurden es mehrere Megabyte, und das Öffnen der Fischschale dauerte ewig.

Die Dateien befinden sich in ~/.config/fish/fishd.xxx schauen Sie sich Ihre an.

In meinem Fall war die Lösung zu tun

set fish_user_paths $PATH /some/path

@NikhilVerma Es ist einfacher, stattdessen nur fish_user_paths zu schattieren, wie set -g fish_user_paths foo $fish_user_paths , was nicht zu rekursiven Änderungen führt, die außer Kontrolle geraten.

SET fish_user_paths:/Users/sztadhaus/Library/Android/sdk

hat bei mir funktioniert!

Etwas, das ich heute entdeckt habe, ist, dass set eine Anhängeoption hat. Wenn Sie also ein bisschen überflüssiges Tippen vermeiden möchten, können Sie zum Beispiel Folgendes tun:

set -Ua fish_user_paths ~/.local/bin

Etwas, das ich heute entdeckt habe, ist, dass set eine Anhängeoption hat. Wenn Sie also ein bisschen überflüssiges Tippen vermeiden möchten, können Sie zum Beispiel Folgendes tun:

set -Ua fish_user_paths ~/.local/bin

Wenn dies erledigt ist, wird die Datei fish_variables mit etwas wie dem folgenden aktualisiert:
/home/myusername/\x2elocal/bin/

Das Problem, das ich habe, ist, dass ich mein gesamtes ~/.config/fish/ -Verzeichnis zwischen Computern synchronisieren möchte, da ich auf mehreren Computern arbeite. Es wäre eine großartige Möglichkeit, ein großartiges Shell-Erlebnis zu bewahren, wohin ich auch gehe. Aber da Tilde zu /home/myusername/ erweitert wird, kann ich es nicht zum Laufen bringen. Ich habe diese Optionen in der Datei fish_variables ausprobiert, aber nichts funktioniert: \x7e/\x2elocal/bin/ , $HOME/\x2elocal/bin/ , "$HOME"/\x2elocal/bin/ .

Eine andere Frage ist, warum ~/.local/bin nicht standardmäßig als PATH in der Fish Shell gesetzt ist, da es Teil der Systemd-Spezifikation ist: https://www.freedesktop.org/software/systemd/man/file-hierarchy. html

Wenn dies erledigt ist, wird die Datei fish_variables mit etwas wie dem folgenden aktualisiert:
/home/meinbenutzername/\x2elocal/bin/

Leider wird der Wert erweitert, wenn er gesetzt wird, und die Tilde wird später nicht erweitert, weil $PATH so nicht funktioniert (der Eintrag wäre für jedes andere Programm außer bash kaputt). Das bedeutet, dass dies nicht funktionieren wird, also müssen Sie eine globale Variable dafür verwenden und sie in config.fish setzen.

Eine andere Frage ist, warum ~/.local/bin nicht standardmäßig als PATH in der Fischschale festgelegt ist

Fish setzt standardmäßig nicht $PATH - es erbt es von Ihrer Umgebung. Das ist eine gute Standardeinstellung, denn das bedeutet, dass Fisch denselben $PATH wie andere Muscheln erhält. Wenn Sie möchten, dass standardmäßig ~/.local/bin hinzugefügt wird, bitten Sie Ihre Distribution, es hinzuzufügen, oder bearbeiten Sie zB /etc/login.defs.

@faho danke für die tolle Antwort. In Bezug auf ~/.local/bin verstehe ich, dass es möglicherweise nicht etwas ist, das Fisch in Verzug setzen möchte. Gleichzeitig hat die Standard-Bash, die beispielsweise mit Ubuntu 18.04.2 LTS (meine aktuelle Installation) installiert wird, dieses Verzeichnis standardmäßig in der .profile-Datei des Benutzers festgelegt. Ich verstehe, dass dies auf andere Weise eingestellt werden kann, aber ich dachte, dass es bei Fisch nur um "gesunde Standardeinstellungen" geht und dass dieses Verzeichnis tatsächlich eine sehr häufige "gesunde Standardeinstellung" ist. Gleichzeitig verstehe ich, dass es aus den von Ihnen genannten Gründen möglicherweise nicht der Philosophie von Fisch entspricht, einen solchen Standard in Fisch aufzunehmen.

edit: Entschuldigung, ich habe gerade festgestellt, dass diese Diskussion nicht zum Thema gehört.

Ein bisschen mehr Off-Topic-Zeug, aber … meine universelle Variable fish_user_paths wird von einer globalen Variablen mit demselben Namen überschattet, die einen alten Wert der Variablen enthält, aber als ein einzelnes Element. Ich habe keine Ahnung, woher es kommt, und eine rekursive Suche nach fish_user_paths in ~/.config/fish gibt nicht viel preis. Was könnte los sein?

Ich verwende Fisch 3.0.2.

> set -Ux fish_user_paths /usr/lib/ccache/bin/ $HOME/.local/bin ...
set: Universal variable 'fish_user_paths' is shadowed by the global variable of the same name.
> set -S fish_user_paths
$fish_user_paths: not set in local scope
$fish_user_paths: set in global scope, exported, with 1 elements
$fish_user_paths[1]: length=134 value=|/usr/lib/ccache/bin/ /home/.../.local/bin ...|
$fish_user_paths: set in universal scope, exported, with 7 elements
$fish_user_paths[1]: length=20 value=|/usr/lib/ccache/bin/|
$fish_user_paths[2]: length=21 value=|/home/.../.local/bin|
$fish_user_paths[3]: ...

set -eg fish_user_paths behebt es für die aktuelle Shell, aber wenn ich eine neue öffne, hat sie immer noch den alten PATH.

@spider-mario Es ist in Ordnung, ein neues Problem zu eröffnen oder im Super User oder einem ähnlichen Forum zu fragen.

Ihr Problem ist, dass Sie eine universelle Variable exportiert haben; das ist fast immer falsch, weil es als globale Variable in untergeordnete Fischprozesse eindringt.

Ich muss das jedes Mal googeln und am Ende lese ich immer diesen Thread durch. Ich schlage vor, einen Befehl wie fish-add-user-path hinzuzufügen, der idempotent ist, wenn derselbe Pfad mehrmals hinzugefügt wird, aber ansonsten nur syntaktischer Zucker zum Setzen fish_user_paths ist

@boxed Ich versuche seit ungefähr zwei Monaten, mich an Fisch zu gewöhnen. Ich muss mindestens ein Dutzend Mal auf diesem Thread gelandet sein.

fish_add_path klingt gut für mich, wenn jemand es anpacken möchte.

#!/usr/bin/env fish
if argparse -n 'fish-add-user-path' -N 1 'h/help' -- $argv
    ;
else
    exit
end

function add_to_path_if_not_there
    set exists 0

    # normalize path to end with /
    switch $argv
    case "*/"
        set new_path $argv
    case "*"
        set new_path "$argv/"
    end

    for x in (string split " " $fish_user_paths)
        if test "$x" = "$new_path"
            set exists 1
            break
        end
    end

    if test "$exists" = "0"
        set -Ux fish_user_paths $fish_user_paths $new_path
    end   
end

# validate that paths exists
for x in (string split " " $argv)
    if test -d $x
        ;
    else
        echo "Path '$x' does not exist"
        exit
    end
end


for x in (string split " " $argv)
    add_to_path_if_not_there $x 
end

Dies ist das erste Fischskript, das ich geschrieben habe, also bin ich mir ziemlich sicher, dass es Mist ist! Aber es tut meistens das Richtige. Wenn Sie mehrere ungültige Pfade passieren, beschwert es sich nur über den ersten, nicht über alle. Und es könnte eine gute Idee sein, wenn es ungültige Pfade akzeptieren kann, wenn Sie ein Flag passieren. Vielleicht.

Aber ansonsten scheint das zu funktionieren, auch wenn es hässlich ist :P

@spider-mario Ich bin mir nicht sicher, ob dies Ihr Problem behebt, aber ich habe set -eg fish_user_paths zu ~/.config/fish/config.fish hinzugefügt und die Einstellung bleibt jetzt für alle Sitzungen für mich bestehen.

echo "set -eg fish_user_paths" >>  ~/.config/fish/config.fish

Gibt es eine Möglichkeit, PATH für alle Benutzer festzulegen? Wie $fish_global_path nicht _user_.

Sie können $PATH in /etc/fish/config.fish ändern, was von allen Benutzern angewendet wird.

Sicher, eine Funktion ist nett, aber hier ist eine schnelle Abkürzung, die mir genauso gut gefällt.

abbr --add path_add "set --universal --append fish_user_paths"

Verwendungszweck:
path_add \\\

@ElijahLynn , das den Pfad nicht validiert und nicht idempotent ist.

Können wir das nicht wieder öffnen? Hier liegt ein schlimmes UX-Problem vor. Fisch interessiert sich normalerweise für dieses Zeug!

@boxed Dieses Problem wurde in viele Richtungen gezogen, also werde ich es sperren. Ich stimme zu, PATH bringt Leute oft zum Stolpern und es gibt wahrscheinlich Dinge, die daran verbessert werden können. Wenn Sie einen Verbesserungsvorschlag haben, wie PATH festgelegt wird, öffnen Sie bitte ein neues Problem.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen