Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does function call from PS1 require escaping?

Tags:

bash

I'm setting my prompt inside of .bash_profile like this

export PS1="\w\$(getBranchName)\n ---->"

My getBranchName function exists, and this works, fine.

My question is, why do I need to escape the call to getBranchName like this \$(getBranchName).

In other words, why doesn't this code work, instead?

export PS1="\w$(getBranchName)\n ---->"

If curious, this is what the getBranchName function looks like

esc="\033"
redf="${esc}[31m"
green="${esc}[32m"
purple="${esc}[35m"
cyanf="${esc}[36m"
reset="${esc}[0m"

getBranchName() {
  if [[ "$(__git_ps1 '%s')" == "master" ]]
  then
    echo -e "${redf}$(__git_ps1)${reset}";
  else
    echo -e "${cyanf}$(__git_ps1)${reset}";
  fi
}

export PS1="\w\$(getBranchName)\n ---->"
like image 666
Adam Rackis Avatar asked Oct 18 '25 20:10

Adam Rackis


1 Answers

You need to escape the dollar because you want to store this exact text in your variable.

Try it by typing echo "$PS1". You should see the exact text : \w$(getBranchName)\n ---->

If you didn't escape it, the function would be evaluated only once, during the allocation.


The bottom line is that PS1 is a special variable : every time you display a new line in the console, the variable is evaluated to extract the display settings.

like image 174
Aserre Avatar answered Oct 21 '25 06:10

Aserre



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!