Groschenroman
Groschenroman

Reputation: 97

Bash prompt does not convert escaped characters

My bash prompt variable in .profile looks like this:

# $vars
# Always display last 2 directories of current path
current_dir() {
  pwd | awk -F\/ '{print $(NF-1),$(NF)}' | sed 's/ /\//g'
}
# Current git branch
parse_git_branch() {
   git branch 2> /dev/null | sed -e '/^[^​*]/d' -e 's/*​ \(.*\)/ (\1)/'
}

txtblk='\e[0;30m' # Black - Regular
txtred='\e[0;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White
bldblk='\e[1;30m' # Black - Bold
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White
unkblk='\e[4;30m' # Black - Underline
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White
bakblk='\e[40m'   # Black - Background
bakred='\e[41m'   # Red
badgrn='\e[42m'   # Green
bakylw='\e[43m'   # Yellow
bakblu='\e[44m'   # Blue
bakpur='\e[45m'   # Purple
bakcyn='\e[46m'   # Cyan
bakwht='\e[47m'   # White
txtrst='\e[0m'    # Text Reset

#           User      Current path (last 2 dirs)    Git branch          Switch to white color
export PS1="$txtcyn\u $txtpur\$(current_dir) $txtgrn\$(parse_git_branch)\[\033[00m\] \n\$ "

So my bash prompt should actually show my username, the current directory the git branch (if there is one) and then a $ in a new line (just as commented above). But instead it shows the string literally, without replacing variables or escaped characters like so:

enter image description here

What am I doing wrong?

Edit: I use iTerm2 on a Mac

Upvotes: 2

Views: 267

Answers (1)

Eliran Malka
Eliran Malka

Reputation: 16263

You cannot create escape sequences inside hard-quotes ('string'), they're always interpreted literally.

Use double quotes instead ("string"), or try ansi-c quoting ($'string').

You can also simply avoid escaping in the first place, if you choose to stick with hard-quotes.

Upvotes: 1

Related Questions