riutilizzare '~ / .profile` per Fish?


34

(Sto parlando del guscio Pesce , esp. Pesce di pesce .)

Per Bash / ZSH, ho avuto ~/.profilecon alcune esportazioni, alias e altre cose.

Non voglio avere una configurazione separata per le variabili di ambiente per Fish, voglio riutilizzare la mia ~/.profile. Come?

Nelle FAQ, si afferma che posso almeno importarli tramite /usr/local/share/fish/tools/import_bash_settings.py, tuttavia non mi piace molto eseguirlo per ogni istanza di Fish.

Risposte:


26

Puoi usare Bash per analizzare / etc / profile e ~ / .profile, e quindi iniziare a pescare.

  1. Crea /usr/local/bin/fishlogincon i contenuti

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. Renderlo eseguibile

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. Aggiungilo a / etc / shells

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. Impostalo come shell predefinita

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

Così elegante! Dovrebbe essere la risposta accettata IMO
yonix

2
Nel caso qualcuno si stia chiedendo, l'equivalente mac di usermod -s /usr/local/bin/fishlogin $USERèchsh -s /usr/local/fishlogin $USER
glorifobia,

1
Se hai chsh: /usr/local/bin/fishlogin: non-standard shellbisogno di aggiungerlo a/etc/shells
Ben Marten,

1
Per imitare completamente il lancio diretto dei pesci, fish "$@"dovrebbe essere sostituito con exec -l fish "$@". execsostituisce il processo bash con pesce, mentre -lcause che argv[0]per i pesci è -fish, che segnala che questa è una shell di login.
jhrmnn,

1
@Sz. Beh no. In primo luogo, il pesce non supporta le conchiglie. E anche se lo facesse, non lo farebbe eseguendo la shell di login, quindi nessun Bash verrebbe generato.
Noé Rubinstein,

15

La mia soluzione attuale (vedi qui per una versione forse più recente):

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
puoi spiegare cosa fa questo?
massimo supplente

@maxpleaner AFAICT cerca nel .profile le dichiarazioni di esportazione e le esegue come set di pesci. È un po 'confuso, ma intelligente.
Jared Smith,

12

Per una soluzione molto più pulita, è possibile utilizzare il plug-in env esterno :

fenv source ~/.profile

5
Questa dovrebbe essere la soluzione accettata. Potresti elaborare (installa omf)
Jules Randolph il

L'installazione di @JulesRandolph di Oh My Fish non è richiesta. Il plugin fish foreign_env può essere installato da solo, non ha dipendenze.
Dominykas Mostauskis,

5

Puoi usare bass , un plugin per eseguire i comandi bash in fish.

  1. Installa i bassi .

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. E poi, basta inserire questo nel tuo config.fish:

    bass source ~/.profile
    

questo è fantastico grazie
ggnoredo

Se stai per utilizzare questo metodo, assicurati che non sia troppo lento. Personalmente ho iniziato a notare che il mio ritardo di avvio della shell era fastidiosamente lungo e l'ho rintracciato al basso.
mk12

@ mk12 probabilmente non è colpa dei bassi, è il tuo .profileche sta succedendo troppo.
rsalmei,

@rsalmei Tutto quello che avevo dentro c'erano variabili di ambiente e definizioni di alias, con alcune istruzioni if. Non provoca alcun ritardo evidente in bash. Quindi penso che sia colpa dei bassi. D'altra parte, sono molto più felice con il plugin fenv . È scritto in shell piuttosto che in Python e sembra molto più veloce per me.
mk12

Sì @ mk12, sembra essere bello, ma anche molto più limitato, in quanto cattura solo variabili di ambiente. bassd'altra parte interpreta qualsiasi script di shell bash e li fa correre nel pesce. Avrà sicuramente un po 'più di spese generali, ma totalmente trascurabile nella mia esperienza, ma il tuo chilometraggio può variare.
rsalmei,

4

Ho provato a reperire .profile all'avvio del pesce e ha funzionato come un incantesimo per me.

basta fare :

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

Riavviare terminal o iterm2, testare un alias da .profiletestare.

Nota: non funziona con file .profile più complessi che utilizzano la sintassi non disponibile in fish - credit @erb


Ha funzionato anche per me! Esecuzione di MacOSX.
Alexar,

Non funzionerà con .profilefile più complessi che utilizzano la sintassi non disponibile in fish.
Erb,

1
@erb Sono d'accordo con te, ho aggiunto l'avvertimento nella risposta.
Eswar Rajesh Pinapala,

3

Installa dashe aggiungi questa linea al tuo 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

Probabilmente non è nemmeno necessario installarlo dash- shlo farà (che è probabilmente un trattino)
Wayne Werner

1

Non puoi. fishLa sintassi è troppo diversa dalla /bin/shsintassi Bourne shell ( ). Questo è lo stesso motivo per cui non è possibile utilizzare .profilecon altre shell non derivate da Bourne, come cshe tcsh.


Non voglio eseguire completamente .profile. Voglio solo ottenere tutti exporti messaggi da lì. Un modo semplice sarebbe quello egrep "^export"che sarebbe già abbastanza buono per me. Un'altra soluzione più corretta sarebbe questa . Inoltre, ad esempio, potrei eseguire questo import_bash_settings.pyscript che probabilmente fa qualcosa di simile. Quindi, ci sono ovviamente molti modi per farlo. Con la mia domanda qui, mi chiedevo come gli altri hanno risolto questo.
Albert,


1

Puoi avviare Fish da Bash. Se lo fai, Fish erediterà tutte le variabili di ambiente ( export FOO=bar) da Bash. A questo punto, Bash avrà già letto il tuo .profile(o simili).

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.