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.

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
    

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

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

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
    

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


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

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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.