在 Mac 中为 Fish 重用 .bash_profile

在 Mac 中为 Fish 重用 .bash_profile

我在 Mac 上使用 iTerm,并且有一个我一直习惯使用的 .bash_profile。我最近了解了 fish bash,并在 Mac 上安装了它,但突然我的 .bash_profile 无法被获取。有什么想法可以解释为什么我看不到它吗?

我怎样才能指示我的 iTerm 和 fish 获取我的 .bach_profile,就像以前没有 fish 那样?

答案1

Fish 只有一个用户控制的配置文件,默认情况下名为 $HOME/.config/fish/config.fish。Fish 还有一个导出命令,用于与 bash/zsh/sh 兼容,但它只是 fish 形式的一个薄包装:

set -gx VAR value

至于 bash 别名,您有两种选择:将它们转换为缩写(请参阅“abbr”命令)或函数。在 fish 中,您可以使用其“alias”命令定义一个函数,但这只会将

alias myalias some_command --arg1 --arg2

进入

function myalias; some_command --arg1 --arg2 $argv; end

正如 Glenn Jackman 指出的那样,“fish 不是 bash”。它不是改进的 bash。切换到 fish 并不难,但确实需要一点努力。我 13 个月前就切换了,我认为值得付出努力。

答案2

您可以使用这个脚本过于真实[要点链接]

它基本上解析 .bash_profile 并在 Fish 中设置相同的环境变量。
对我来说效果很好!

# Fish shell

egrep "^export " ~/.bash_profile | while read e
    set var (echo $e | sed -E "s/^export ([A-Za-z_]+)=(.*)\$/\1/")
    set value (echo $e | sed -E "s/^export ([A-Za-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)

    #echo "set -xg '$var' '$value' (via '$e')"
    set -xg $var $value
end

答案3

我正在使用与 Pavel 的脚本类似的脚本,但我也重复使用别名。

将其放入~/.config/fish/config.fish然后重新启动终端。

# REUSE ALIASES FROM ~/.bash_profile
egrep "^alias " ~/.bash_profile | while read e
        set var (echo $e | sed -E "s/^alias ([A-Za-z0-9_-]+)=(.*)\$/\1/")
        set value (echo $e | sed -E "s/^alias ([A-Za-z0-9_-]+)=(.*)\$/\2/")

        # remove surrounding quotes if existing
        set value (echo $value | sed -E "s/^\"(.*)\"\$/\1/")

    # evaluate variables. we can use eval because we most likely just used "$var"
        set value (eval echo $value)

    # set an alias
    alias $var="$value"
end

# REUSE ENVIRONMENT VARIABLES FROM ~/.bash_profile
egrep "^export " ~/.bash_profile | while read e
    set var (echo $e | sed -E "s/^export ([A-Z0-9_]+)=(.*)\$/\1/")
    set value (echo $e | sed -E "s/^export ([A-Z0-9_]+)=(.*)\$/\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)

    #echo "set -xg '$var' '$value' (via '$e')"

    switch $value
            case '`*`';
            # executable
            set NO_QUOTES (echo $value | sed -E "s/^\`(.*)\`\$/\1/")
            set -x $var (eval $NO_QUOTES)
        case '*'
            # default
            set -xg $var $value
        end
end

相关内容