重复使用Fish的〜/ .profile`吗?


34

(我说的是贝壳,尤其是鱼的鱼。)

对于Bash / ZSH,我有~/.profile一些导出,别名和其他内容。

我不想为Fish的环境变量设置单独的配置,我想重用我的~/.profile。怎么样?

在FAQ中,我至少可以通过导入这些对象/usr/local/share/fish/tools/import_bash_settings.py,但是我不太喜欢为每个Fish-instance运行它们。

Answers:


26

您可以使用Bash解析/ etc / profile和〜/ .profile,然后启动fish。

  1. /usr/local/bin/fishlogin用内容创建

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. 使它可执行

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. 将其添加到/ etc / shells

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. 将其设置为默认外壳

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

真优雅!应该是IMO的公认答案
yonix

2
以防万一有人想知道,mac的等效条件usermod -s /usr/local/bin/fishlogin $USERchsh -s /usr/local/fishlogin $USER
gloriphobia

1
如果chsh: /usr/local/bin/fishlogin: non-standard shell需要添加到/etc/shells
Ben Marten

1
要完全模仿直接下鱼,fish "$@"应改为exec -l fish "$@"exec用fish替换bash进程,而-l导致fish的原因argv[0]-fish,这表明这是登录shell。
jhrmnn

1
@Sz。好吧,不 Fish首先不支持子壳。即使这样做,也不会通过执行您的登录Shell来这样做,因此届时将不会产生Bash。
的Noé鲁宾斯坦

15

我当前的解决方案(请参阅此处,以获得更新的版本):

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
你能解释一下这是什么吗?
max pleaner

@maxpleaner AFAICT它通过.profile查找出口声明,并将其作为鱼集执行。这有点hacky,但是很聪明。
贾里德·史密斯

12

对于更干净的解决方案,可以使用外部env插件:

fenv source ~/.profile

5
这应该是公认的解决方案。您可以详细说明(安装omf)
Jules Randolph

不需要@JulesRandolph安装Oh My Fish。foreign_env fish插件可以单独安装,没有依赖性。
Dominykas Mostauskis

5

您可以使用bass(一个插件)在fish中执行bash命令。

  1. 安装低音

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. 然后,将其放入您的config.fish

    bass source ~/.profile
    

太棒了,谢谢
ggnoredo

如果要使用此方法,请确保它不太慢。我个人开始注意到我的外壳启动延迟很烦人,然后一直跟踪到低音。
mk12

@ mk12可能不是低音的错,这是您的.profile问题太多了。
rsalmei

@rsalmei我只拥有环境变量和别名定义,以及一些if语句。它不会导致bash明显延迟。所以我认为这是低音的错。另一方面,我对fenv插件满意。它是用Shell而不是Python编写的,对我来说似乎要快得多。
mk12

是的,@ mk12看起来不错,但是也更受限制,因为它仅捕获环境变量。bass另一方面解释任何bash shell脚本,并使它们在鱼中运行。当然会有更多的开销,但根据我的经验可以忽略不计,但是您的里程可能会有所不同。
rsalmei

4

我尝试将.profile采购到鱼类创业公司,它对我来说就像一个魅力。

做就是了 :

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

重新启动终端或iterm2,从中测试别名.profile

注意:无法使用使用fish-credit @erb中不可用的语法的更复杂的.profile文件


也为我工作!运行MacOSX。
Alexar

无法.profile使用使用fish中不可用的语法的更复杂的文件。
erb

1
@erb我同意你的看法,我在警告中添加了警告。
Eswar Rajesh Pinapala '16

3

安装dash此行并将其添加到您的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

可能甚至不需要安装dash-只需安装sh(可能有点破了)
Wayne Werner

1

你不能 fish的语法与Bourne shell(/bin/sh)语法完全不同。这是不能.profile与其他非Bourne派生的shell(例如csh和)一起使用的相同原因tcsh


我不想完全执行.profile。我只想export从那里得到所有。一种简单的方法egrep "^export"对我来说已经足够了。另一个更正确的解决方案是this。另外,例如,我可以运行此import_bash_settings.py脚本,该脚本可能执行类似的操作。因此,显然有很多方法可以做到这一点。带着我在这里的问题,我想知道其他人如何解决这个问题。
艾伯特


1

您可以从Bash开始Fish。如果这样做,Fish将继承export FOO=barBash的所有环境变量()。此时,Bash将已经阅读您的.profile(或类似的)信息。

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.