"~ / .profile" für Fische wiederverwenden?


34

(Ich spreche von der Shell Fisch , insb. Des Fisches Fisch .)

Für Bash / ZSH hatte ich ~/.profilemit einigen Exporten, Aliasen und anderem Zeug zu tun .

Ich möchte keine separate Konfiguration für Umgebungsvariablen für Fish haben, ich möchte my wiederverwenden ~/.profile. Wie?

In den FAQ wird angegeben, dass ich diese zumindest über importieren kann /usr/local/share/fish/tools/import_bash_settings.py, aber ich mag es nicht wirklich, das für jede Fisch-Instanz auszuführen.

Antworten:


26

Sie können Bash verwenden, um / etc / profile und ~ / .profile zu analysieren und dann fish zu starten.

  1. /usr/local/bin/fishloginMit Inhalten erstellen

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. Mach es ausführbar

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. Fügen Sie es zu / etc / shells hinzu

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. Legen Sie es als Ihre Standardshell fest

    sudo usermod -s /usr/local/bin/fishlogin $USER
    

So elegant! Sollte die akzeptierte Antwort sein IMO
yonix

2
Nur für den Fall jemand fragen, der mac Äquivalent usermod -s /usr/local/bin/fishlogin $USERistchsh -s /usr/local/fishlogin $USER
gloriphobia

1
Wenn Sie es chsh: /usr/local/bin/fishlogin: non-standard shellhinzufügen müssen/etc/shells
Ben Marten

1
Um das Starten von Fischen direkt vollständig zu imitieren, fish "$@"sollte durch ersetzt werden exec -l fish "$@". execErsetzt den Bash-Prozess durch Fisch, während für Fisch -lbewirkt argv[0]wird -fish, dass dies eine Anmelde-Shell ist.
Jhrmnn

1
@Sz. Naja, nein. Fisch unterstützt in erster Linie keine Unterschalen. Und selbst wenn dies der Fall wäre, würde dies nicht durch Ausführen Ihrer Anmeldeshell geschehen, sodass dann kein Bash erzeugt würde.
Noé Rubinstein

15

Meine aktuelle Lösung (siehe hier für eine möglicherweise neuere Version):

egrep "^export " ~/.profile | while read e
    set var (echo $e | sed -E "s/^export ([A-Z_]+)=(.*)\$/\1/")
    set value (echo $e | sed -E "s/^export ([A-Z_]+)=(.*)\$/\2/")

    # remove surrounding quotes if existing
    set value (echo $value | sed -E "s/^\"(.*)\"\$/\1/")

    if test $var = "PATH"
        # replace ":" by spaces. this is how PATH looks for Fish
        set value (echo $value | sed -E "s/:/ /g")

        # use eval because we need to expand the value
        eval set -xg $var $value

        continue
    end

    # evaluate variables. we can use eval because we most likely just used "$var"
    set value (eval echo $value)

    set -xg $var $value
end

3
Kannst du erklären, was das macht?
Max Pleaner

@maxpleaner AFAICT durchsucht .profile nach Exportanweisungen und führt sie als Fischmengen aus. Es ist ein bisschen abgedreht, aber klug.
Jared Smith

12

Für eine viel sauberere Lösung können Sie das fremde Env- Plugin verwenden:

fenv source ~/.profile

5
Dies sollte die akzeptierte Lösung sein. Sie könnten ausarbeiten (Omf installieren)
Jules Randolph

@JulesRandolph Installation von Oh My Fish ist nicht erforderlich. Das foreign_env fish Plugin kann alleine installiert werden, es hat keine Abhängigkeiten.
Dominykas Mostauskis

5

Sie können Bass , ein Plugin, verwenden, um Bash-Befehle in Fischen auszuführen.

  1. Bass einbauen .

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. Und dann geben Sie dies einfach ein config.fish:

    bass source ~/.profile
    

Das ist großartig, danke
ggnoredo

Wenn Sie diese Methode verwenden möchten, stellen Sie sicher, dass sie nicht zu langsam ist. Ich persönlich bemerkte, dass meine Shell-Startverzögerung ärgerlich lang war, und verfolgte sie bis zum Bass.
5.

@ mk12 wahrscheinlich ist es nicht Bass 'Schuld, es ist deine .profile, die zu viel los ist.
Rsalmei

@rsalmei Alles, was ich dort hatte, waren Umgebungsvariablen- und Aliasdefinitionen mit ein paar if-Anweisungen. Es verursacht keine merkliche Verzögerung bei der Bash. Ich denke, es ist Bass 'Schuld. Andererseits bin ich mit dem Fenv-Plugin viel glücklicher . Es ist eher in Shell als in Python geschrieben und scheint für mich viel schneller zu sein.
7.

Yeah @ mk12, es scheint nett zu sein, aber auch viel eingeschränkter, da es nur Umgebungsvariablen erfasst. bassAuf der anderen Seite werden alle Bash-Shell-Skripte interpretiert und in Fisch ausgeführt. Es wird sicherlich etwas mehr Aufwand haben, aber meiner Erfahrung nach völlig vernachlässigbar, aber Ihre Laufleistung kann variieren.
Rsalmei

4

Ich habe versucht, .profile beim Fischstart zu beschaffen, und es hat wie ein Zauber für mich funktioniert.

mach einfach :

echo 'source ~/.profile;clear;' >  ~/.config/fish/config.fish

Starten Sie terminal oder iterm2 neu und testen Sie einen Alias ​​von .profilebis test.

Hinweis: Funktioniert nicht mit komplexeren .profile-Dateien, deren Syntax in fish-credit @erb nicht verfügbar ist


Arbeitete auch für mich! MacOSX ausführen.
Alexar

Funktioniert nicht mit komplexeren .profileDateien, deren Syntax für Fische nicht verfügbar ist.
erb

1
Wenn ich dir zustimme, habe ich die Einschränkung in der Antwort hinzugefügt.
Eswar Rajesh Pinapala

3

Installieren Sie dashund fügen Sie diese Zeile zu Ihrem config.fish:

env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source

Vermutlich brauchen Sie nicht einmal zu installieren dash- wird nur shtun (was wahrscheinlich Bindestrich ist)
Wayne Werner

1

Das kannst du nicht. fishDie Syntax von unterscheidet sich zu stark von der von Bourne shell ( /bin/sh). Dies ist der gleiche Grund, warum Sie ihn nicht für .profileandere nicht von Bourne abgeleitete Shells verwenden können, z. B. cshund tcsh.


Ich möchte nicht vollständig ausführen .profile. Ich will nur alle exports von dort bekommen. Ein einfacher Weg wäre der, egrep "^export"der mir schon gut genug wäre. Eine andere, korrektere Lösung wäre dies . Außerdem könnte ich zB dieses import_bash_settings.pySkript ausführen, das wahrscheinlich etwas Ähnliches macht. Es gibt also offensichtlich viele Möglichkeiten, dies zu tun. Mit meiner Frage hier habe ich mich gefragt, wie andere dies gelöst haben.
Albert


1

Sie können Fisch von Bash starten. In diesem Fall erbt Fish alle Umgebungsvariablen ( export FOO=bar) von Bash. Zu diesem Zeitpunkt hat Bash Ihr .profile(oder ähnliches) bereits gelesen .

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.