我将此 bash 脚本添加到我的 ./bashrc 中,但是脚本运行时终端中出现了一个非打印字符,我该如何修复它?
#!/bin/sh
## +-----------------------------------+-----------------------------------+
## | |
## | FANCY BASH PROMT |
## | |
## | Copyright (c) 2018, Andres Gongora <[email protected]>. |
## | |
## | This program is free software: you can redistribute it and/or modify |
## | it under the terms of the GNU General Public License as published by |
## | the Free Software Foundation, either version 3 of the License, or |
## | (at your option) any later version. |
## | |
## | This program is distributed in the hope that it will be useful, |
## | but WITHOUT ANY WARRANTY; without even the implied warranty of |
## | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
## | GNU General Public License for more details. |
## | |
## | You should have received a copy of the GNU General Public License |
## | along with this program. If not, see <http://www.gnu.org/licenses/>. |
## | |
## +-----------------------------------------------------------------------+
##
## DESCRIPTION:
## This script updates your "PS1" environment variable to display colors.
## Addicitionally, it also shortens the name of your current part to maximum
## 25 characters, which is quite useful when working in deeply nested folders.
##
##
##
## INSTALLATION:
## Copy this script to your home folder and rename it to ".fancy-bash-promt.sh"
## Run this command from any terminal:
## echo "source ~/.fancy-bash-promt.sh" >> ~/.bashrc
##
## Alternatively, copy the content of this file into your .bashrc file
##
##
##
## FUNCTIONS:
##
## * bash_prompt_command()
## This function takes your current working directory and stores a shortened
## version in the variable "NEW_PWD".
##
## * format_font()
## A small helper function to generate color formating codes from simple
## number codes (defined below as local variables for convenience).
##
## * bash_prompt()
## This function colorizes the bash promt. The exact color scheme can be
## configured here. The structure of the function is as follows:
## 1. A. Definition of available colors for 16 bits.
## 1. B. Definition of some colors for 256 bits (add your own).
## 2. Configuration >> EDIT YOUR PROMT HERE<<.
## 4. Generation of color codes.
## 5. Generation of window title (some terminal expect the first
## part of $PS1 to be the window title)
## 6. Formating of the bash promt ($PS1).
##
## * Main script body:
## It calls the adequate helper functions to colorize your promt and sets
## a hook to regenerate your working directory "NEW_PWD" when you change it.
##
################################################################################
## FUNCTIONS ##
################################################################################
##
## ARRANGE $PWD AND STORE IT IN $NEW_PWD
## * The home directory (HOME) is replaced with a ~
## * The last pwdmaxlen characters of the PWD are displayed
## * Leading partial directory names are striped off
## /home/me/stuff -> ~/stuff (if USER=me)
## /usr/share/big_dir_name -> ../share/big_dir_name (if pwdmaxlen=20)
##
## Original source: WOLFMAN'S color bash promt
## https://wiki.chakralinux.org/index.php?title=Color_Bash_Prompt#Wolfman.27s
##
bash_prompt_command() {
# How many characters of the $PWD should be kept
local pwdmaxlen=25
# Indicate that there has been dir truncation
local trunc_symbol=".."
# Store local dir
local dir=${PWD##*/}
# Which length to use
pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
NEW_PWD=${PWD/#$HOME/\~}
local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
# Generate name
if [ ${pwdoffset} -gt "0" ]
then
NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
fi
}
##
## GENERATE A FORMAT SEQUENCE
##
format_font()
{
## FIRST ARGUMENT TO RETURN FORMAT STRING
local output=$1
case $# in
2)
eval $output="'\[\033[0;${2}m\]'"
;;
3)
eval $output="'\[\033[0;${2};${3}m\]'"
;;
4)
eval $output="'\[\033[0;${2};${3};${4}m\]'"
;;
*)
eval $output="'\[\033[0m\]'"
;;
esac
}
##
## COLORIZE BASH PROMT
##
bash_prompt() {
############################################################################
## COLOR CODES ##
## These can be used in the configuration below ##
############################################################################
## FONT EFFECT
local NONE='0'
local BOLD='1'
local DIM='2'
local UNDERLINE='4'
local BLINK='5'
local INVERT='7'
local HIDDEN='8'
## COLORS
local DEFAULT='9'
local BLACK='0'
local RED='1'
local GREEN='2'
local YELLOW='3'
local BLUE='4'
local MAGENTA='5'
local CYAN='7'
local L_GRAY='7'
local D_GRAY='60'
local L_RED='61'
local L_GREEN='62'
local L_YELLOW='63'
local L_BLUE='64'
local L_MAGENTA='65'
local L_CYAN='66'
local WHITE='67'
## TYPE
local RESET='0'
local EFFECT='0'
local COLOR='30'
local BG='40'
## 256 COLOR CODES
local NO_FORMAT="\[\033[0m\]"
local ORANGE_BOLD="\[\033[1;38;5;208m\]"
local TOXIC_GREEN_BOLD="\[\033[1;38;5;118m\]"
local RED_BOLD="\[\033[1;38;5;1m\]"
local CYAN_BOLD="\[\033[1;38;5;87m\]"
local BLACK_BOLD="\[\033[1;38;5;0m\]"
local WHITE_BOLD="\[\033[1;38;5;15m\]"
local GRAY_BOLD="\[\033[1;90m\]"
local BLUE_BOLD="\[\033[1;38;5;74m\]"
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## CONFIGURE HERE ##
############################################################################
## CONFIGURATION ##
## Choose your color combination here ##
############################################################################
local FONT_COLOR_1=$WHITE
local BACKGROUND_1=$BLUE
local TEXTEFFECT_1=$BOLD
local FONT_COLOR_2=$WHITE
local BACKGROUND_2=$L_BLUE
local TEXTEFFECT_2=$BOLD
local FONT_COLOR_3=$D_GRAY
local BACKGROUND_3=$WHITE
local TEXTEFFECT_3=$BOLD
local PROMT_FORMAT=$BLUE_BOLD
############################################################################
## EXAMPLE CONFIGURATIONS ##
## I use them for different hosts. Test them out ;) ##
############################################################################
## CONFIGURATION: BLUE-WHITE
if [ "$HOSTNAME" = dell ]; then
FONT_COLOR_1=$WHITE; BACKGROUND_1=$BLUE; TEXTEFFECT_1=$BOLD
FONT_COLOR_2=$WHITE; BACKGROUND_2=$L_BLUE; TEXTEFFECT_2=$BOLD
FONT_COLOR_3=$D_GRAY; BACKGROUND_3=$WHITE; TEXTEFFECT_3=$BOLD
PROMT_FORMAT=$CYAN_BOLD
fi
## CONFIGURATION: BLACK-RED
if [ "$HOSTNAME" = giraff6 ]; then
FONT_COLOR_1=$WHITE; BACKGROUND_1=$BLACK; TEXTEFFECT_1=$BOLD
FONT_COLOR_2=$WHITE; BACKGROUND_2=$D_GRAY; TEXTEFFECT_2=$BOLD
FONT_COLOR_3=$WHITE; BACKGROUND_3=$RED; TEXTEFFECT_3=$BOLD
PROMT_FORMAT=$RED_BOLD
fi
## CONFIGURATION: RED-BLACK
#FONT_COLOR_1=$WHITE; BACKGROUND_1=$RED; TEXTEFFECT_1=$BOLD
#FONT_COLOR_2=$WHITE; BACKGROUND_2=$D_GRAY; TEXTEFFECT_2=$BOLD
#FONT_COLOR_3=$WHITE; BACKGROUND_3=$BLACK; TEXTEFFECT_3=$BOLD
#PROMT_FORMAT=$RED_BOLD
## CONFIGURATION: CYAN-BLUE
if [ "$HOSTNAME" = sharkoon ]; then
FONT_COLOR_1=$BLACK; BACKGROUND_1=$L_CYAN; TEXTEFFECT_1=$BOLD
FONT_COLOR_2=$WHITE; BACKGROUND_2=$L_BLUE; TEXTEFFECT_2=$BOLD
FONT_COLOR_3=$WHITE; BACKGROUND_3=$BLUE; TEXTEFFECT_3=$BOLD
PROMT_FORMAT=$CYAN_BOLD
fi
## CONFIGURATION: GRAY-SCALE
if [ "$HOSTNAME" = giraff ]; then
FONT_COLOR_1=$WHITE; BACKGROUND_1=$BLACK; TEXTEFFECT_1=$BOLD
FONT_COLOR_2=$WHITE; BACKGROUND_2=$D_GRAY; TEXTEFFECT_2=$BOLD
FONT_COLOR_3=$WHITE; BACKGROUND_3=$L_GRAY; TEXTEFFECT_3=$BOLD
PROMT_FORMAT=$BLACK_BOLD
fi
## CONFIGURATION: GRAY-CYAN
if [ "$HOSTNAME" = light ]; then
FONT_COLOR_1=$WHITE; BACKGROUND_1=$BLACK; TEXTEFFECT_1=$BOLD
FONT_COLOR_2=$WHITE; BACKGROUND_2=$D_GRAY; TEXTEFFECT_2=$BOLD
FONT_COLOR_3=$BLACK; BACKGROUND_3=$L_CYAN; TEXTEFFECT_3=$BOLD
PROMT_FORMAT=$CYAN_BOLD
fi
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
############################################################################
## TEXT FORMATING ##
## Generate the text formating according to configuration ##
############################################################################
## CONVERT CODES: add offset
FC1=$(($FONT_COLOR_1+$COLOR))
BG1=$(($BACKGROUND_1+$BG))
FE1=$(($TEXTEFFECT_1+$EFFECT))
FC2=$(($FONT_COLOR_2+$COLOR))
BG2=$(($BACKGROUND_2+$BG))
FE2=$(($TEXTEFFECT_2+$EFFECT))
FC3=$(($FONT_COLOR_3+$COLOR))
BG3=$(($BACKGROUND_3+$BG))
FE3=$(($TEXTEFFECT_3+$EFFECT))
FC4=$(($FONT_COLOR_4+$COLOR))
BG4=$(($BACKGROUND_4+$BG))
FE4=$(($TEXTEFFECT_4+$EFFECT))
## CALL FORMATING HELPER FUNCTION: effect + font color + BG color
local TEXT_FORMAT_1
local TEXT_FORMAT_2
local TEXT_FORMAT_3
local TEXT_FORMAT_4
format_font TEXT_FORMAT_1 $FE1 $FC1 $BG1
format_font TEXT_FORMAT_2 $FE2 $FC2 $BG2
format_font TEXT_FORMAT_3 $FC3 $FE3 $BG3
format_font TEXT_FORMAT_4 $FC4 $FE4 $BG4
# GENERATE PROMT SECTIONS
local PROMT_USER=$"$TEXT_FORMAT_1 \u "
local PROMT_HOST=$"$TEXT_FORMAT_2 \h "
local PROMT_PWD=$"$TEXT_FORMAT_3 \${NEW_PWD} "
local PROMT_INPUT=$"$PROMT_FORMAT "
############################################################################
## SEPARATOR FORMATING ##
## Generate the separators between sections ##
## Uses background colors of the sections ##
############################################################################
## CONVERT CODES
TSFC1=$(($BACKGROUND_1+$COLOR))
TSBG1=$(($BACKGROUND_2+$BG))
TSFC2=$(($BACKGROUND_2+$COLOR))
TSBG2=$(($BACKGROUND_3+$BG))
TSFC3=$(($BACKGROUND_3+$COLOR))
TSBG3=$(($DEFAULT+$BG))
## CALL FORMATING HELPER FUNCTION: effect + font color + BG color
local SEPARATOR_FORMAT_1
local SEPARATOR_FORMAT_2
local SEPARATOR_FORMAT_3
format_font SEPARATOR_FORMAT_1 $TSFC1 $TSBG1
format_font SEPARATOR_FORMAT_2 $TSFC2 $TSBG2
format_font SEPARATOR_FORMAT_3 $TSFC3 $TSBG3
# GENERATE SEPARATORS WITH FANCY TRIANGLE
local TRIANGLE=$'\uE0B0'
local SEPARATOR_1=$SEPARATOR_FORMAT_1$TRIANGLE
local SEPARATOR_2=$SEPARATOR_FORMAT_2$TRIANGLE
local SEPARATOR_3=$SEPARATOR_FORMAT_3$TRIANGLE
############################################################################
## WINDOW TITLE ##
## Prevent messed up terminal-window titles ##
############################################################################
case $TERM in
xterm*|rxvt*)
local TITLEBAR='\[\033]0;\u:${NEW_PWD}\007\]'
;;
*)
local TITLEBAR=""
;;
esac
############################################################################
## BASH PROMT ##
## Generate promt and remove format from the rest ##
############################################################################
PS1="$TITLEBAR\n${PROMT_USER}${SEPARATOR_1}${PROMT_HOST}${SEPARATOR_2}${PROMT_PWD}${SEPARATOR_3}${PROMT_INPUT}"
## For terminal line coloring, leaving the rest standard
none="$(tput sgr0)"
trap 'echo -ne "${none}"' DEBUG
}
################################################################################
## MAIN ##
################################################################################
## Bash provides an environment variable called PROMPT_COMMAND.
## The contents of this variable are executed as a regular Bash command
## just before Bash displays a prompt.
## We want it to call our own command to truncate PWD and store it in NEW_PWD
PROMPT_COMMAND=bash_prompt_command
## Call bash_promnt only once, then unset it (not needed any more)
## It will set $PS1 with colors and relative to $NEW_PWD,
## which gets updated by $PROMT_COMMAND on behalf of the terminal
bash_prompt
unset bash_prompt
### EOF ###
但我的终端输出如下
[akkilah akkilah-PC ~ ]
如何删除这些非打印字符?
1这是我的命令行的图片
更新 1:我发现这可能很有趣:
akkilah akkilah-PC ~ echo "\ue0b0 \u00b1 \ue0a0 \u27a6 \u2718 \u26a1 \u2699"
\ue0b0 \u00b1 \ue0a0 \u27a6 \u2718 \u26a1 \u2699
更新2:
akkilah akkilah-PC ~ echo -e "\ue0b0 \u00b1 \ue0a0 \u27a6 \u2718 \u26a1 \u2699"
± ➦ ✘ ⚡ ⚙
答案1
它打印的是它要打印的内容。您只需要一些字体来呈现图标。
我建议使用 fira-code 字体。尝试一下并检查提示。
sudo apt install fonts-firacode