2017-08-12 3 views
1

Mon bash variable d'invite à .profile ressemble à ceci:invite Bash ne convertit pas les caractères échappé

# $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\$ " 

Donc, mon invite bash devrait réellement montrer mon nom d'utilisateur, le répertoire courant de la branche git (s'il y en a un) et puis un $ dans une nouvelle ligne (comme ci-dessus commenté). Mais au lieu, il montre la chaîne littéralement, sans remplacer les variables ou des caractères échappées comme ceci:

enter image description here

Qu'est-ce que je fais mal?

Edit: J'utilise iTerm2 sur un Mac

+0

Avez-vous soit prendre nouvelle session ou le nouveau chargé .profile comme il avait l'air il a travaillé pour moi. – RavinderSingh13

+0

Oui. J'ai essayé 'source ~/.profile'. Je déclare même une variable d'essai au-dessus du fichier '.profile' et répercuté après l'approvisionnement. Ça a marché. Donc, le fichier était à jour. – Groschenroman

+0

J'utilise iTerm2 en passant. Peut-être que c'est quelque peu pertinent. – Groschenroman

Répondre

1

Vous ne pouvez pas créer des séquences d'échappement à l'intérieur dur guillemets ('string'), ils sont toujours interprétés littéralement. Utilisez des guillemets doubles ("string") ou essayez ansi-c quoting ($'string').

Vous pouvez également éviter tout simplement échapper en premier lieu, si vous choisissez de coller avec des disques guillemets.

+0

Cela semble ne faire que la moitié du tour. J'ai remplacé tous les guillemets simples et mon invite bash ressemble toujours à ceci: '\ e [0; 36m \ u00a0 \ 0; 35m $ (current_dir) \ e [0; 32m $ (parse_git_branch) \ [\ 033 [00m \] \ n ' $ Si je'echo PS1' de $, il montre: ' $ (current_dir) $ (parse_git_branch) \ [\] $ \ e [0; 36m \ u \ e [0 ; 35m $ (current_dir) \ e [0; 32m $ (parse_git_branch) \ [\ 033 [00m \] \ n $ ' – Groschenroman

+0

vous devriez certainement utiliser la citation ansi-c alors, par exemple '$ '\ 033 [9m''. Pour faciliter les choses lors du formatage des chaînes de sortie, jetez un coup d'oeil au [styli.sh formater] (https://github.com/eliranmal/styli.sh). disclaimer: je l'ai écrit –