ponownie użyć „~ / .profile” dla ryb?

34

(Mówię o skorupce Fish , zwłaszcza Fish's Fish .)

W przypadku Bash / ZSH miałem ~/.profiletrochę eksportu, aliasów i innych rzeczy.

Nie chcę mieć osobnej konfiguracji dla zmiennych środowiskowych dla Fisha, chcę ponownie użyć mojej ~/.profile. W jaki sposób?

W często zadawanych pytaniach stwierdzono, że mogę przynajmniej zaimportować te pliki /usr/local/share/fish/tools/import_bash_settings.py, jednak tak naprawdę nie lubię uruchamiać tego dla każdej instancji Fish.

Albert
źródło

Odpowiedzi:

26

Możesz użyć Bash do parsowania / etc / profile i ~ / .profile, a następnie uruchomić fish.

  1. Twórz /usr/local/bin/fishloginz zawartością

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. Zrób to

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. Dodaj go do / etc / shells

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. Ustaw jako domyślną powłokę

    sudo usermod -s /usr/local/bin/fishlogin $USER
    
Noé Rubinstein
źródło
Taki elegancki! Powinna być zaakceptowana odpowiedź IMO
yonix
2
Na wypadek, gdyby ktoś się zastanawiał, odpowiednikiem mac usermod -s /usr/local/bin/fishlogin $USERjestchsh -s /usr/local/fishlogin $USER
glorifofobia
1
Jeśli chsh: /usr/local/bin/fishlogin: non-standard shellmusisz dodać to do/etc/shells
Ben Marten
1
Aby w pełni naśladować wypuszczanie ryb bezpośrednio, fish "$@"należy je zastąpić exec -l fish "$@". execzastępuje proces bash rybą, podczas gdy -lpowoduje, że argv[0]dla ryb jest -fish, co sygnalizuje, że jest to powłoka logowania.
jhrmnn
1
@Sz. Cóż, nie. Ryba nie obsługuje przede wszystkim podpowłok. I nawet gdyby tak się stało, nie zrobiłby tego, wykonując powłokę logowania, więc nie pojawi się wtedy Bash.
Noé Rubinstein
15

Moje obecne rozwiązanie (zobacz tutaj, być może najnowszą wersję):

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
Albert
źródło
3
czy możesz wyjaśnić, co to robi?
max pleaner
@maxpleaner AFAICT przegląda plik .profile pod kątem instrukcji eksportu i wykonuje je jako zestawy ryb. To trochę zuchwałe, ale sprytne.
Jared Smith
12

Aby uzyskać znacznie czystsze rozwiązanie, możesz użyć zagranicznej wtyczki env :

fenv source ~/.profile
jgillich
źródło
5
To powinno być przyjęte rozwiązanie. Możesz opracować (zainstalować omf)
Jules Randolph
@JulesRandolph instalacja Oh My Fish nie jest wymagana. Wtyczka rybacka Foreign_env może być zainstalowana sama, nie ma zależności.
Dominykas Mostauskis
5

Możesz użyć basu , wtyczki do wykonywania poleceń bash u ryb.

  1. Zainstaluj bas .

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. A następnie po prostu umieść to w swoim config.fish:

    bass source ~/.profile
    
rsalmei
źródło
to jest niesamowite, dziękuję
ggnoredo
Jeśli zamierzasz użyć tej metody, upewnij się, że nie jest ona zbyt wolna. Osobiście zacząłem zauważać, że moje opóźnienie uruchamiania powłoki było denerwująco długie i śledziłem to do basu.
mk12
@ mk12 prawdopodobnie nie jest to wina basu, to twoje .profilezbyt wiele się dzieje.
rsalmei
@rsalmei Wszystko, co tam miałem, to zmienne środowiskowe i definicje aliasów, z kilkoma instrukcjami if. Nie powoduje zauważalnego opóźnienia w bashu. Myślę więc, że to wina basu. Z drugiej strony jestem znacznie bardziej zadowolony z wtyczki fenv . Jest napisany raczej w powłoce niż w Pythonie i wydaje mi się znacznie szybszy.
mk12
Tak @ mk12, wydaje się być miły, ale także znacznie bardziej ograniczony, ponieważ przechwytuje tylko zmienne środowiskowe. bassz drugiej strony interpretuje każdy skrypt powłoki bash i sprawia, że ​​działają na rybach. Z pewnością będzie to miało nieco większy koszt, ale z mojego doświadczenia jest zupełnie nieistotne, ale przebieg może się różnić.
rsalmei
4

Próbowałem uzyskać .profile przy uruchamianiu ryb i działało to dla mnie jak urok.

po prostu zrób :

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

Zrestartuj terminal lub iterm2, przetestuj alias od .profiledo testu.

Uwaga: nie będzie działać z bardziej złożonymi plikami .profile, które używają składni niedostępnej w usłudze fish - credit @erb

Eswar Rajesh Pinapala
źródło
Pracowałem też dla mnie! Uruchamianie MacOSX.
Alexar,
Nie będzie działać z bardziej złożonymi .profileplikami, które używają składni niedostępnej w rybach.
erb
1
@erb Zgadzam się z tobą, dodałem zastrzeżenie w odpowiedzi.
Eswar Rajesh Pinapala
3

Zainstaluj dashi dodaj ten wiersz do 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
Jegoriusz
źródło
Prawdopodobnie nawet nie trzeba instalować dash- wystarczy shto zrobić (co jest prawdopodobnie kreską)
Wayne Werner
1

Nie możesz fishSkładnia jest zbyt różna od /bin/shskładni powłoki Bourne'a ( ). Jest to ten sam powód, dla którego nie można używać .profilez innymi powłokami niepochodzącymi z Bourne'a, takimi jak cshi tcsh.

Spiff
źródło
Nie chcę w pełni wykonać .profile. Chcę po prostu dostać exportstamtąd stamtąd. Jednym łatwym sposobem byłby, egrep "^export"który byłby dla mnie wystarczająco dobry. Innym, bardziej poprawnym rozwiązaniem byłoby to . Mogę też np. Uruchomić ten import_bash_settings.pyskrypt, który prawdopodobnie robi coś podobnego. Jest więc oczywiście wiele sposobów, aby to zrobić. Z moim pytaniem zastanawiałem się, jak inni to rozwiązali.
Albert
1

Jeśli Twoja dystrybucja używa PAM , możesz ustawić zmienne środowiskowe w swoim ~/.pam_environmentpliku.

kzh
źródło
1

Możesz rozpocząć Fish from Bash. Jeśli to zrobisz, Fish odziedziczy wszystkie zmienne środowiskowe ( export FOO=bar) po Bash. W tym momencie Bash będzie już czytał twoje .profile(lub podobne).

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
cmey
źródło