
Ich verwende ein benutzerdefiniertes PS1, um relevantere Informationen in meinem Terminal anzuzeigen, z. B. ob ich mich in einem Git-Verzeichnis befinde und ob es sauber ist oder Änderungen vorgenommen werden müssen. Manchmal verschwindet jedoch ein Teil der Terminalzeile, wenn ich mit den Pfeiltasten durch die Befehle blättere:
@ ~/tests/testing [tests] > grunt
# up arrow, down arrow
@ ~/tests/testing [t
Im Wesentlichen wird das ests] >
abgeschnitten und mir bleibt nur das übrig [t
.
Gibt es einen bestimmten Grund, warum bei dieser PS1-Konfiguration ein Teil der Leitung abgeschnitten wird?
Hier sind einige zusätzliche Informationen:
Meine TERM-Umgebungsvariable ist xterm-256color
. Hier ist meine .bash_profile
:
red='\033[0;31m'
yellow='\033[0;32m'
orange='\033[0;33m'
blue='\033[0;34m'
pink='\033[0;35m'
NC='\033[0m'
function is_git {
if git rev-parse --is-inside-work-tree 2>/dev/null; then
return 1
else
return 0
fi
}
function stuff {
if [ $(is_git) ]; then
git_dir="$(git rev-parse --git-dir 2>/dev/null)"
if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
echo -en " [${orange}init${NC}]"
return
fi
echo -n " ["
if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
echo -en "${red}"
else
echo -en "${blue}"
fi
echo -en "$(git rev-parse --abbrev-ref HEAD)${NC}]"
fi
}
export PS1="@ \w\[\$(stuff)\]\[\$(tput sgr0)\] > "
Antwort1
Der Vorschlag von @i_am_root, das \[
und \]
in die Definition von red
und dergleichen einzufügen, ist gut. AllerdingsDas, Bash verarbeitet \[
und nur \]
in PS1
, nicht in Text, der in PS1
von enthalten ist $()
. Verwenden Sie daher \001
und \002
(oder \x01
und \x02
) innerhalb red
von und dergleichen anstelle von \[
und \]
.
Hinweis: Prodiese Antwort, nur die Escape-Codes sollten in \001
und stehen \002
. Der für den Benutzer sichtbare Text sollte außerhalb von \001
und stehen \002
, damit Bash weiß, dass er Platz auf dem Bildschirm einnimmt und dies beim Neuzeichnen berücksichtigen kann.
Antwort2
Bash-Farbcodes, Escape-Zeichen, Zuweisungen und dergleichen können schnell verwirrend sein.
Probieren Sie dieses Codebeispiel aus, das die echo
Befehle durch Hinzufügen zur PS1
Variablen ersetzt.
red='\[\033[0;31m\]'
yellow='\[\033[0;32m\]'
orange='\[\033[0;33m\]'
blue='\[\033[0;34m\]'
pink='\[\033[0;35m\]'
NC='\[\033[0m\]'
export PS1="@ \w"
function is_git {
if git rev-parse --is-inside-work-tree 2>/dev/null; then
return 1
else
return 0
fi
}
function stuff {
if [ $(is_git) ]; then
git_dir="$(git rev-parse --git-dir 2>/dev/null)"
if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
PS1="${PS1} [${orange}init${NC}]"
return
fi
PS1="$PS1 ["
if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
PS1="${PS1}${red}"
else
PS1="${PS1}${blue}"
fi
PS1="${PS1}$(git rev-parse --abbrev-ref HEAD)${NC}]"
fi
}
stuff
PS1="${PS1}$(tput sgr0) > "