Reuse .bash_profile for Fish in Mac

8

4

I'm using iTerm on my Mac and I have a .bash_profile that I have been comfortably using. I recently got to know about fish bash and I installed it on my Mac and all of a sudden my .bash_profile is not being sourced. Any ideas as to why I could not see it?

How could I instruct my iTerm and fish to source my .bach_profile like it was doing before without fish?

sparkr

Posted 2016-12-01T14:10:24.637

Reputation: 191

2fish uses ~/.config/fish/config.fish for configuration. – DavidPostill – 2016-12-01T17:13:52.060

3

fish is not bash. It's a different language with a different syntax. If there are functions or aliases you want to keep, you'll need to rewrite them. Be sure to read the tutorial

– glenn jackman – 2016-12-01T18:13:13.817

Could you post me some examples? All I have in my .bash_profile are just some exports and some aliases. I would like to reuse them for fish! – sparkr – 2016-12-02T04:43:45.490

1

Possible duplicate of re-use '~/.profile` for Fish?

– Daniel Centore – 2018-01-04T05:17:52.537

Answers

6

Fish has exactly one user controlled config file which is named $HOME/.config/fish/config.fish by default. Fish also has an export command for compatibility with bash/zsh/sh but it just a thin wrapper around the fish form:

set -gx VAR value

As for bash aliases you have two choices: turn them into abbreviations (see the "abbr" command) or functions. In fish you can define a function with its "alias" command but that simply turns

alias myalias some_command --arg1 --arg2

into

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

As Glenn Jackman pointed "fish is not bash". It is not an improved bash. Switching to fish isn't hard but does require a little effort. I made the switch 13 months ago and think it is worth the effort.

Kurtis Rader

Posted 2016-12-01T14:10:24.637

Reputation: 919

after doing this how do I do the equivalent of source ~/.bash_profile – wfbarksdale – 2018-03-25T03:00:39.983

1@wfbarksdale – source ~/.config/fish/config.fish. – leymannx – 2018-10-12T11:01:39.250

2

You can use this script by overtrue: [gist link]

It basically parses .bash_profile and sets the same environment variables in Fish.
Works great for me!

# 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

Pavel Alexeev

Posted 2016-12-01T14:10:24.637

Reputation: 121

Please explain what this does, how it works, and how to use it.  Please do not respond in comments; [edit] your answer to make it clearer and more complete. – Scott – 2019-02-18T00:12:41.543

The above script is designed to be used with Oh My Fish (https://github.com/oh-my-fish/oh-my-fish) by writing it to the initialization file ~/.config/omf/init.fish with the command curl -o ~/.config/omf/init.fish https://gist.githubusercontent.com/overtrue/f7cd321708ba917b8def/raw/88d5930885210b9cee49782b4bc9bea8efd746ec/init.fish

– Adam Erickson – 2019-03-05T16:54:05.923