在 Stackoverflow 上,我刚刚看到一个有关PS1
环境变量的问题,该变量负责 Linux 终端提示符。
我的提示如下:
username@PORT-usr:/dir
username
是我登录 WSL 时使用的用户名。PORT-usr
是我的笔记本电脑的名称。/dir
是我当前的目录。
我的PS1
环境变量如下所示:
Prompt>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\]\$
尝试执行此操作不起作用:
Prompt>echo $($PS1)
\[\e]0;\u@\h:: command not found
Prompt>echo echo $(\[\e]0;\u@\h: \w\a\]${debian_chroot...)
e]0: command not found
u@h:: command not found
32m]u@h[033[00m]:[033[01: command not found
34m]w[033[00m]$: command not found
使用的变量的语法是什么$PS1
?我可以使用什么命令来学习理解该语法?
答案1
shellPS1
变量(可能是也可能不是环境变量)不包含常规 shell 命令。它使用特定于您所使用的各种 shell 的特殊过程扩展为提示符。它可能包含普通echo
命令无法识别的特殊序列。
您的 shell 提示符看起来像 Debian(以及可能相关的发行版)的默认提示符。 Debian 对于普通用户帐户的默认 shell 是bash
,因此您应该查看PROMPTING
、man bash
或第 6.9 章:控制提示Bash 参考手册。
要了解任何嵌入式终端控制代码,您可能还必须参考终端仿真器的相应文档,例如Xterm控制序列参考。
以下是当前提示的解释方式:
\[ ... \] encapsulates any terminal control codes that will not result in
any visible output on the prompt line
\e]0; Xterm control code to set terminal window title and icon name
\u@\h: \w expands to window title <username>@<hostname>: <workdir>
\a indicates the end of terminal window title / icon name string
\] end of encapsulation
${debian_chroot:+($debian_chroot)}
if variable $debian_chroot is defined, adds text
"(<contents of $debian_chroot>)" to the prompt
\[ encapsulates terminal control codes, see above
\033[01;32m set bold output with green foreground color
\] end encapsulation
\u@\h expands to "<username>@<hostname>" in the prompt
\[ encapsulates terminal control codes, see above
\033[00m reset to normal output
\] end encapsulation
: outputs a ":" character
\[ encapsulates terminal control codes, see above
\033[01;34m set bold output with blue foreground color
\] end encapsulation
\w outputs the current working directory
\[ encapsulates terminal control codes, see above
\033[00m reset to normal output
\] end encapsulation
\$ outputs "$" if a regular user, "#" when UID 0 (root)
如果\[
...\]
非打印字符的封装没有正确完成,当命令行变得比终端的宽度长时,您将看到换行错误。
答案2
的语法PS1
是一种自己的语言,不能只是echo
打印出来。
要了解它,您唯一的选择是查看 shell 的文档: https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html
答案3
如果您将PS1
定义放在您的定义之外的单独文件中,.bashrc
则每次保存文件时都会更新提示。
例子:
- 在你的
.bashrc
文件中:pcmd() { _error_value=$?; PS1=$(~/.pcmd $_error_value); } PROMPT_COMMAND=pcmd;
- 并在您的主目录中创建新
.pcmd
文件(必须是可执行的chmod a+x .pcmd
)#!/bin/bash _error_value=$1; _now=$(date +%H:%M); _error_r_time=$([ "$_error_value" != "0" ] && echo "[\[\e[1;37m\]>\[\e[1;31m\]$_error_value\[\e[1;37m\]<\[\e[m]\]" || echo "[\[\e[1;37m\]$_now\[\e[m\]"); echo "[\[\e[1;32m\]\u\[\e[m\]@\[\e[1;36m\]\h\[\e[m\]](\[\e[1;32m\]\w\[\e[m\])$_error_r_time$ "