reutilizar '~ / .profile` para Fish?

34

(Estoy hablando de la cáscara de los pescados , esp. De pescado de pescado ).

Para Bash / ZSH, tuve ~/.profilealgunas exportaciones, alias y otras cosas.

No quiero tener una configuración separada para las variables de entorno para Fish, quiero reutilizar mi ~/.profile. ¿Cómo?

En las preguntas frecuentes, se dice que al menos puedo importarlos a través de /usr/local/share/fish/tools/import_bash_settings.py, sin embargo, no me gusta ejecutar eso para cada instancia de Fish.

Albert
fuente

Respuestas:

26

Puede usar Bash para analizar / etc / profile y ~ / .profile, y luego iniciar fish.

  1. Crea /usr/local/bin/fishlogincon contenidos

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. Hazlo ejecutable

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. Agréguelo a / etc / shells

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. Configúralo como tu shell predeterminado

    sudo usermod -s /usr/local/bin/fishlogin $USER
    
Noé Rubinstein
fuente
¡Muy elegante! Debería ser la respuesta aceptada OMI
yonix
2
En caso de que alguien se pregunte, el equivalente mac de usermod -s /usr/local/bin/fishlogin $USEReschsh -s /usr/local/fishlogin $USER
gloriphobia
1
Si chsh: /usr/local/bin/fishlogin: non-standard shellnecesita agregarlo a/etc/shells
Ben Marten
1
Para imitar completamente el lanzamiento de peces directamente, fish "$@"debe reemplazarse con exec -l fish "$@". execreemplaza el proceso bash con fish, mientras -lque lo hace argv[0]para fish is -fish, lo que indica que se trata de un shell de inicio de sesión.
jhrmnn
1
@Sz. Pues no. Fish no admite subcapas en primer lugar. E incluso si lo hiciera, no lo haría ejecutando su shell de inicio de sesión, por lo que no se generaría Bash en ese momento.
Noé Rubinstein el
15

Mi solución actual (ver aquí para una versión quizás más reciente):

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
fuente
3
¿Puedes explicar qué hace esto?
máximo demandante el
@maxpleaner AFAICT busca en .profile las declaraciones de exportación y las ejecuta como conjuntos de peces. Es un poco hacky, pero inteligente.
Jared Smith
12

Para una solución mucho más limpia, puede usar el complemento env extranjero :

fenv source ~/.profile
jgillich
fuente
55
Esta debería ser la solución aceptada. Podrías elaborar (instalar omf)
Jules Randolph
No se requiere la instalación de @JulesRandolph de Oh My Fish. El complemento de pescado foreign_env se puede instalar solo, no tiene dependencias.
Dominykas Mostauskis
5

Puede usar bass , un complemento para ejecutar comandos bash en fish.

  1. Instalar bajo .

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. Y luego, solo pon esto en tu config.fish:

    bass source ~/.profile
    
rsalmei
fuente
esto es increíble gracias
ggnoredo
Si va a utilizar este método, asegúrese de que no sea demasiado lento. Personalmente comencé a notar que mi retraso de inicio de shell era molestamente largo, y lo rastreé hasta el bajo.
mk12
@ mk12 probablemente no es culpa del bajo, es tu el .profileque tiene demasiado en juego .
rsalmei
@rsalmei Todo lo que tenía allí eran variables de entorno y definiciones de alias, con algunas declaraciones if. No causa un retraso notable en bash. Así que creo que es culpa del bajo. Por otro lado, estoy mucho más feliz con el complemento fenv . Está escrito en shell en lugar de Python y me parece mucho más rápido.
mk12
Sí @ mk12, parece ser agradable, pero también mucho más limitado, ya que solo captura variables de entorno. bassPor otro lado, interpreta cualquier script de shell bash y hace que se ejecuten en peces. Ciertamente tendrá un poco más de gastos generales, pero en mi experiencia es totalmente insignificante, pero su kilometraje puede variar.
rsalmei
4

Traté de obtener .profile en el inicio de pescado y funcionó como un encanto para mí.

solo haz :

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

Reinicie el terminal o iterm2, pruebe un alias de .profilea prueba.

Nota: No funcionará con archivos .profile más complejos que usan una sintaxis no disponible en fish - credit @erb

Eswar Rajesh Pinapala
fuente
¡También funcionó para mí! Ejecutando MacOSX.
Alexar
No funcionará con .profilearchivos más complejos que usan una sintaxis no disponible en fish.
erb
1
@erb Estoy de acuerdo contigo, agregué la advertencia en la respuesta.
Eswar Rajesh Pinapala
3

Instale dashy agregue esta línea a su 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
fuente
Probablemente ni siquiera necesite instalar dash, solo shlo hará (lo que probablemente sea un guión)
Wayne Werner
1

No puedes fishLa sintaxis es muy diferente de la sintaxis de Bourne shell ( /bin/sh). Esta es la misma razón por la que no se puede usar .profilecon otros shells no derivados de Bourne, como cshy tcsh.

Spiff
fuente
No quiero ejecutar completamente .profile. Solo quiero obtener todos los exportmensajes de ahí. Una manera fácil sería para egrep "^export"que ya fuera lo suficientemente bueno para mí. Otra solución más correcta sería esta . Además, por ejemplo, podría ejecutar este import_bash_settings.pyscript que probablemente haga algo similar. Entonces, obviamente hay muchas maneras de hacer esto. Con mi pregunta aquí, me preguntaba cómo otros han resuelto esto.
Albert
1

Puedes comenzar Fish from Bash. Si hace eso, Fish heredará todas las variables de entorno ( export FOO=bar) de Bash. En este punto, Bash ya habrá leído tu .profile(o similar).

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