reutilizar '~ / .profile` para peixes?


34

(Eu estou falando sobre o shell peixe , esp. Peixe de Peixe .)

Para o Bash / ZSH, tive ~/.profilealgumas exportações, aliases e outras coisas.

Não quero ter uma configuração separada para variáveis ​​de ambiente do Fish, quero reutilizar o meu ~/.profile. Quão?

No FAQ, é declarado que eu posso pelo menos importá-los via /usr/local/share/fish/tools/import_bash_settings.py, no entanto, eu realmente não gosto de executar isso para cada instância de Fish.

Respostas:


26

Você pode usar o Bash para analisar / etc / profile e ~ / .profile e, em seguida, iniciar o fish.

  1. Criar /usr/local/bin/fishlogincom conteúdo

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. Torne executável

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. Adicione-o ao / etc / shells

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. Defina-o como seu shell padrão

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

Tão elegante! Deve ser a resposta aceita IMO
yonix 22/03

2
Just in case anyone is wondering, the mac equivalent of usermod -s /usr/local/bin/fishlogin $USER is chsh -s /usr/local/fishlogin $USER
gloriphobia

1
Se você se chsh: /usr/local/bin/fishlogin: non-standard shellprecisa para adicioná-lo/etc/shells
Ben Marten

1
Para imitar completamente o lançamento de peixes diretamente, fish "$@"deve ser substituído por exec -l fish "$@". execsubstitui o processo do bash por fish, enquanto -lfaz com que seja argv[0]para fish -fish, o que indica que este é um shell de logon.
jhrmnn

1
@Sz. Bem, não. O peixe não suporta subcascas em primeiro lugar. E mesmo que isso acontecesse, ele não faria isso executando seu shell de login, para que o Bash não fosse gerado.
Noé Rubinstein

15

Minha solução atual (veja aqui uma versão talvez mais 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
você pode explicar o que isso faz?
max pleaner

O @maxpleaner AFAICT procura no .profile as instruções de exportação e as executa como conjuntos de peixes. É meio hacky, mas inteligente.
Jared Smith

12

Para uma solução muito mais limpa, você pode usar o plug-in env estrangeiro :

fenv source ~/.profile

5
Essa deve ser a solução aceita. Você poderia elaborar (instalar OMF)
Jules Randolph

A instalação do @JulesRandolph do Oh My Fish não é necessária. O plugin fish Foreign_env pode ser instalado sozinho, não possui dependências.
Dominykas Mostauskis 20/10

5

Você pode usar o bass , um plugin para executar comandos bash em peixes.

  1. Instale baixo .

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. E então, basta colocar isso no seu config.fish:

    bass source ~/.profile
    

isso é incrível obrigado
ggnoredo

Se você usar esse método, verifique se não é muito lento. Pessoalmente, comecei a perceber que meu atraso na inicialização do shell era irritantemente longo e o rastreei até o baixo.
mk12 5/09

@ mk12 provavelmente não é culpa do baixo, é você .profileque tem muita coisa acontecendo.
rsalmei 6/09

@rsalmei Tudo o que eu tinha lá era variável de ambiente e definições de alias, com algumas declarações if. Não causa atraso perceptível no bash. Então eu acho que é culpa do baixo. Por outro lado, estou muito mais feliz com o plugin fenv . Ele está escrito em shell e não em Python e parece muito mais rápido para mim.
mk12 7/09

Sim @ mk12, parece bom, mas também muito mais limitado, pois captura apenas variáveis ​​de ambiente. basspor outro lado, interpreta qualquer script do shell bash e os faz rodar em peixes. Certamente terá um pouco mais de sobrecarga, mas é totalmente insignificante na minha experiência, mas sua milhagem pode variar.
rsalmei 11/09

4

Tentei pesquisar .profile na inicialização de peixes e funcionou como um encanto para mim.

apenas faça :

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

Reinicie o terminal ou iterm2, teste um alias de .profilepara testar.

Nota: Não funcionará com arquivos .profile mais complexos que usam sintaxe não disponível no fish - credit @erb


Trabalhou para mim também! Executando o MacOSX.
Alexar # 6/15

Não funcionará com .profilearquivos mais complexos que usam sintaxe não disponível no fish.
erb

1
@erb eu concordo com você, eu adicionei a ressalva na resposta.
Eswar Rajesh Pinapala

3

Instale dashe adicione esta linha ao seu 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

Provavelmente nem precisa instalar dash- apenas shfará (o que provavelmente é um arremetida)
Wayne Werner

1

Você não pode. fishA sintaxe de é muito diferente do shell Bourne (/bin/sh sintaxe ). Esse é o mesmo motivo que você não pode usar .profilecom outros invólucros não derivados de Bourne, como cshe tcsh.


Eu não quero executar completamente .profile. Eu só quero pegar todos os exports de lá. Uma maneira fácil seria a egrep "^export"que já seria suficiente para mim. Outra solução mais correta seria essa . Além disso, por exemplo, eu poderia executar esse import_bash_settings.pyscript, o que provavelmente faz algo semelhante. Portanto, obviamente existem muitas maneiras de fazer isso. Com a minha pergunta aqui, eu queria saber como os outros resolveram isso.
Albert


1

Você pode iniciar o Fish a partir do Bash. Se você fizer isso, o Fish herdará todas as variáveis ​​de ambiente ( export FOO=bar) do Bash. Neste ponto, o Bash já terá lido o seu .profile(ou algo semelhante).

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.