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

14076
Albert

(Ich spreche von der Muschel Fish, besonders von Fish's Fish .)

Für Bash / ZSH hatte ich ~/.profileeinige Exporte, Aliase und anderes Zeug.

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

In den FAQ wird angegeben, dass ich diese zumindest über importieren /usr/local/share/fish/tools/import_bash_settings.pykann. Allerdings mag ich das nicht für jede Fish-Instanz.

24

9 Antworten auf die Frage

18
Noé Rubinstein

Sie können Bash verwenden, um / etc / profile und ~ / .profile zu analysieren und dann mit dem Fisch zu beginnen.

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

    #!/bin/bash -l exec -l fish "$@" 
  2. Machen Sie 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 Standardshell fest

    sudo usermod -s /usr/local/bin/fishlogin $USER 
So elegant! Sollte die akzeptierte Antwort IMO sein yonix vor 7 Jahren 0
Nur für den Fall, dass sich jemand wundert, ist das Mac-Äquivalent von "usermod -s / usr / local / bin / fishlogin $ USER" "chsh -s / usr / local / fishlogin $ USER" gloriphobia vor 6 Jahren 2
Wenn Sie "chsh: / usr / local / bin / fishlogin: non-standard shell" erhalten, müssen Sie es zu "/ etc / shells" hinzufügen Ben Marten vor 6 Jahren 1
Um das Starten von Fischen direkt vollständig zu imitieren, sollte `fish" $ @ "` durch `exec -l fish" $ @ "` ersetzt werden. "exec" ersetzt den Bash-Prozess durch Fische, während "-l" bewirkt, dass "argv [0]" für Fische "-fish" ist, was bedeutet, dass es sich um eine Login-Shell handelt. azag0 vor 6 Jahren 1
Normalerweise keine große Sache, aber dies scheint den Nachteil zu haben, dass immer dann, wenn eine Subshell implizit erstellt wird, eine unnötige Bash-Instanz zuerst gestartet wird. (Hinweis: "~ / .profile" ist nur für Anmeldungs-Shells relevant.) Trotzdem wegen des guten Kompromisses zwischen Einfachheit und Hackerin immer noch positiv bewertet. (Ich persönlich würde meine Shell-Konfigurationsskripte lieber noch ein wenig anpassen, da ich längst aufgegeben habe, komplizierte zu haben, zugunsten von benutzerdefinierten Shell-unabhängigen Methoden.) Sz. vor 5 Jahren 0
@Sz. Nun, nein. Fisch unterstützt überhaupt keine Subshells. Und selbst wenn dies der Fall wäre, würde dies nicht durch Ausführen der Login-Shell erfolgen, und es würde dann kein Bash erscheinen. Noé Rubinstein vor 5 Jahren 1
OK, danke für die Klarstellung! Sz. vor 5 Jahren 0
14
Albert

Meine aktuelle Lösung (sehen Sie hier für eine vielleicht aktuellere 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 
Kannst du erklären, was das bedeutet? max pleaner vor 7 Jahren 3
@maxpleaner AFAICT Durchsucht .profile nach Exportanweisungen und führt sie als Fischmengen aus. Es ist irgendwie hackig, aber klug. Jared Smith vor 5 Jahren 0
7
jgillich

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

fenv source ~/.profile 
Dies sollte die akzeptierte Lösung sein. Sie könnten etwas näher ausführen (omf installieren) Jules Randolph vor 6 Jahren 3
3
Eswar Rajesh Pinapala

Ich habe versucht, .profile über das Startup von Fisch zu beschaffen, und es funktionierte für mich wie ein Zauber.

mach einfach :

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

Starten Sie terminal oder iterm2 neu, testen Sie einen Alias ​​von .profiletest.

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

Arbeitete auch für mich! MacOSX ausführen Alexar vor 8 Jahren 0
Funktioniert nicht mit komplexeren `.profile'-Dateien, deren Syntax nicht in Fisch verfügbar ist. erb vor 7 Jahren 0
@erb Ich stimme dir zu, ich habe den Vorbehalt in der Antwort hinzugefügt. Eswar Rajesh Pinapala vor 7 Jahren 1
2
Yegorius

Installieren dashSie diese Zeile und fügen Sie diese hinzu 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 
1
Spiff

You can't. fish's syntax is too different from Bourne shell (/bin/sh) syntax. This is the same reason you can't use .profile with other non-Bourne-derived shells, such as csh and tcsh.

Ich möchte `.profile` nicht vollständig ausführen. Ich möchte nur alle `Exports von dort bekommen. Ein einfacher Weg wäre "egrep" ^ export "", was für mich schon gut genug wäre. Eine andere, richtigere Lösung wäre [this] (http://superuser.com/questions/446929/run-any-shell-script-from-fish-and-import-all-exported-env-variables). Ich könnte auch dieses `import_bash_settings.py`-Skript ausführen, das wahrscheinlich etwas Ähnliches macht. Es gibt also offensichtlich viele Möglichkeiten, dies zu tun. Mit meiner Frage fragte ich mich, wie andere das gelöst haben. Albert vor 11 Jahren 0
1
kzh

Wenn Ihre Distribution PAM verwendet, können Sie Ihre Umgebungsvariablen in Ihrer ~/.pam_environmentDatei festlegen .

1
cmey

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

bash-3.2$ export TEST="test" bash-3.2$ fish cmey@MBP ~> echo $TEST test 
0
rsalmei

Warum fügst du nicht einfach das config.fishhier ein:

bass source ~/.profile 

bass ist ein Plugin zum Ausführen von Bash-Befehlen in fish.