对 bash 提示符的含义感到困惑

对 bash 提示符的含义感到困惑

我发现在bash中,$PS1可以修改该变量来更改提示符。问题是我在尝试理解给我的一长串代码时遇到了一些困难。

我做了:

echo "$PS1"

我得到了: \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$。终端显示为user@hostname:~$

如果有人能帮我弄清楚这意味着什么,我将不胜感激。

谢谢,深渊:-)

答案1

这些代码的含义可以在 bash 手册的 PROMPTING 部分找到 ( man bash)

PROMPTING
       When executing interactively, bash displays the primary prompt PS1 when it is ready to read a command, and the
       secondary  prompt PS2 when it needs more input to complete a command.  Bash displays PS0 after it reads a com‐
       mand but before executing it.  Bash displays PS4 as described above before tracing each command  when  the  -x
       option  is  enabled.  Bash allows these prompt strings to be customized by inserting a number of backslash-es‐
       caped special characters that are decoded as follows:
              \a     an ASCII bell character (07)
              \d     the date in "Weekday Month Date" format (e.g., "Tue May 26")
              \D{format}
                     the format is passed to strftime(3) and the result is inserted into the prompt string; an  empty
                     format results in a locale-specific time representation.  The braces are required
              \e     an ASCII escape character (033)
              \h     the hostname up to the first `.'
              \H     the hostname
              \j     the number of jobs currently managed by the shell
              \l     the basename of the shell's terminal device name
              \n     newline
              \r     carriage return
              \s     the name of the shell, the basename of $0 (the portion following the final slash)
              \t     the current time in 24-hour HH:MM:SS format
              \T     the current time in 12-hour HH:MM:SS format
              \@     the current time in 12-hour am/pm format
              \A     the current time in 24-hour HH:MM format
              \u     the username of the current user
              \v     the version of bash (e.g., 2.00)
              \V     the release of bash, version + patch level (e.g., 2.00.0)
              \w     the  current  working  directory,  with  $HOME  abbreviated  with a tilde (uses the value of the
                     PROMPT_DIRTRIM variable)
              \W     the basename of the current working directory, with $HOME abbreviated with a tilde
              \!     the history number of this command
              \#     the command number of this command
              \$     if the effective UID is 0, a #, otherwise a $
              \nnn   the character corresponding to the octal number nnn
              \\     a backslash
              \[     begin a sequence of non-printing characters, which could be used to embed a terminal control se‐
                     quence into the prompt
              \]     end a sequence of non-printing characters

       The  command number and the history number are usually different: the history number of a command is its posi‐
       tion in the history list, which may include commands restored from the history file (see HISTORY below), while
       the command number is the position in the sequence of commands executed during the current shell session.  Af‐
       ter the string is decoded, it is expanded via parameter expansion, command substitution, arithmetic expansion,
       and  quote removal, subject to the value of the promptvars shell option (see the description of the shopt com‐
       mand under SHELL BUILTIN COMMANDS below).

答案2

您需要逐个字符、逐个控制代码地遍历整个字符串。两个手册页会有所帮助:man bash、 和man console_codes。参见例如man bash

PROMPTING
.
.
.
   \e     an ASCII escape character (033)
.
.
.
   \[     begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
      

等等,或者man console_codes例如“ECMA-48 Set Graphics Rendition”代码,例如ESC [01;32m将前景色设置为粗体绿色。

基本上,上面的PS1字符串将图标名称和窗口标题设置为主机上的用户:工作目录,然后以粗体绿色向主机上的用户提示,然后以粗体蓝色显示工作目录,然后是一个$符号。

相关内容