réutiliser «~ / .profile» pour Fish?

34

(Je parle de la coquille de poisson , esp. Poisson de poisson .)

Pour Bash / ZSH, j'ai eu ~/.profileavec quelques exportations, alias et autres trucs.

Je ne veux pas avoir une configuration séparée pour les variables d'environnement pour Fish, je veux réutiliser mon ~/.profile. Comment?

Dans la FAQ, il est indiqué que je peux au moins les importer via /usr/local/share/fish/tools/import_bash_settings.py, mais je n'aime pas vraiment l'exécuter pour chaque instance de Fish.

Albert
la source

Réponses:

26

Vous pouvez utiliser Bash pour analyser / etc / profile et ~ / .profile, puis démarrer fish.

  1. Créer /usr/local/bin/fishloginavec du contenu

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. Rendez-le exécutable

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. Ajoutez-le à / etc / shells

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. Définissez-le comme votre shell par défaut

    sudo usermod -s /usr/local/bin/fishlogin $USER
    
Noé Rubinstein
la source
Si élégant! Devrait être la réponse acceptée IMO
yonix
2
Juste au cas où quelqu'un se demanderait, l'équivalent mac de usermod -s /usr/local/bin/fishlogin $USERischsh -s /usr/local/fishlogin $USER
gloriphobia
1
Si vous avez chsh: /usr/local/bin/fishlogin: non-standard shellbesoin de l'ajouter à/etc/shells
Ben Marten
1
Pour imiter pleinement le lancement du poisson directement, fish "$@"doit être remplacé par exec -l fish "$@". execremplace le processus bash par fish, tandis -lque celui argv[0]de fish est -fish, ce qui indique qu'il s'agit d'un shell de connexion.
jhrmnn
1
@Sz. Et bien non. Le poisson ne prend pas en charge les sous-coquilles en premier lieu. Et même si c'était le cas, il ne le ferait pas en exécutant votre shell de connexion, donc aucun Bash ne serait alors généré.
Noé Rubinstein
15

Ma solution actuelle (voir ici pour une version peut-être plus récente):

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
la source
3
pouvez-vous expliquer ce que cela fait?
max pleaner du
@maxpleaner AFAICT, il recherche dans .profile les instructions d'exportation et les exécute sous forme de jeux de poissons. C'est un peu hacky, mais intelligent.
Jared Smith,
12

Pour une solution beaucoup plus propre, vous pouvez utiliser le plugin env étranger :

fenv source ~/.profile
jgillich
la source
5
Cela devrait être la solution acceptée. Vous pouvez élaborer (installer omf)
Jules Randolph
L'installation de @JulesRandolph d'Oh My Fish n'est pas requise. Le plugin fish foreign_env peut être installé seul, il n'a pas de dépendances.
Dominykas Mostauskis
5

Vous pouvez utiliser bass , un plugin pour exécuter des commandes bash dans fish.

  1. Installez des basses .

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. Et puis, mettez cela dans votre config.fish:

    bass source ~/.profile
    
rsalmei
la source
c'est génial merci
ggnoredo
Si vous allez utiliser cette méthode, assurez-vous qu'elle n'est pas trop lente. Personnellement, j'ai commencé à remarquer que le délai de démarrage de mon shell était terriblement long, et je l'ai suivi jusqu'à la basse.
mk12
@ mk12 ce n'est probablement pas la faute des basses, c'est la vôtre .profilequi en a trop.
rsalmei
@rsalmei Tout ce que j'avais là-dedans était des définitions de variables d'environnement et d'alias, avec quelques instructions if. Il ne provoque aucun retard notable dans bash. Je pense donc que c'est la faute de la basse. D'un autre côté, je suis beaucoup plus satisfait du plugin fenv . Il est écrit en shell plutôt qu'en Python et semble beaucoup plus rapide pour moi.
mk12
Ouais @ mk12, ça a l'air sympa, mais aussi beaucoup plus limité, car il ne capture que les variables d'environnement. bassd'autre part interprète tout script shell bash, et les faire fonctionner dans le poisson. Il aura certainement un peu plus de frais généraux, mais totalement négligeable selon mon expérience, mais votre kilométrage peut varier.
rsalmei
4

J'ai essayé de sourcer .profile au démarrage de fish et cela a fonctionné comme un charme pour moi.

fais juste:

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

Redémarrez le terminal ou l'iterm2, testez un alias de .profileà tester.

Remarque: ne fonctionnera pas avec des fichiers .profile plus complexes qui utilisent une syntaxe non disponible dans fish - credit @erb

Eswar Rajesh Pinapala
la source
A aussi fonctionné pour moi! Exécution de MacOSX.
Alexar
Ne fonctionnera pas avec des .profilefichiers plus complexes qui utilisent une syntaxe non disponible dans fish.
erb
1
@erb Je suis d'accord avec vous, j'ai ajouté la mise en garde dans la réponse.
Eswar Rajesh Pinapala
3

Installez dashet ajoutez cette ligne à votre 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
yegorius
la source
Probablement même pas besoin d'installer dash- shfera juste (ce qui est probablement un tiret)
Wayne Werner
1

Tu ne peux pas. fishLa syntaxe de est trop différente de la /bin/shsyntaxe Bourne shell ( ). C'est la même raison que vous ne pouvez pas utiliser .profileavec d'autres shells non dérivés de Bourne, tels que cshet tcsh.

Spiff
la source
Je ne veux pas exécuter complètement .profile. Je veux juste obtenir tout exportde là. Un moyen simple serait de trouver egrep "^export"ce qui serait déjà assez bon pour moi. Une autre solution plus correcte serait la suivante . De plus, je pourrais par exemple exécuter ce import_bash_settings.pyscript qui fait probablement quelque chose de similaire. Il y a donc évidemment de nombreuses façons de procéder. Avec ma question ici, je me demandais comment d'autres ont résolu cela.
Albert
1

Si votre distribution utilise PAM , vous pouvez définir vos variables d'environnement dans votre ~/.pam_environmentfichier.

kzh
la source
1

Vous pouvez démarrer Fish from Bash. Si vous faites cela, Fish héritera de toutes les variables d'environnement ( export FOO=bar) de Bash. À ce stade, Bash aura déjà lu votre .profile(ou similaire).

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