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?

  • 1
    fish uses ~/.config/fish/config.fish for configuration. – DavidPostill Dec 1 '16 at 17:13
  • 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 Dec 1 '16 at 18:13
  • 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 Dec 2 '16 at 4:43
  • 1
    Possible duplicate of re-use '~/.profile` for Fish? – Daniel Centore Jan 4 '18 at 5:17

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


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.

  • after doing this how do I do the equivalent of source ~/.bash_profile – wfbarksdale Mar 25 '18 at 3:00
  • @wfbarksdale – source ~/.config/fish/config.fish. – leymannx Oct 12 '18 at 11:01

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


    # 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
New contributor
Pavel Alexeev is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
  • 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 16 hours ago

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.