Bash Shell:控制 PS1、PS2、PS3、PS4 和 PROMPT_COMMAND

举报
Tiamo_T 发表于 2021/11/24 22:10:26 2021/11/24
【摘要】 如果您有效地使用 PS1、PS2、PS3、PS4 和 PROMPT_COMMAND,您与 Linux Bash shell 的交互将变得非常愉快。PS 代表提示语,本文将使用简单示例为您提供有关 Linux 命令提示符环境变量的快速入门。

如果您有效地使用 PS1、PS2、PS3、PS4 和 PROMPT_COMMAND,您与 Linux Bash shell 的交互将变得非常愉快。PS 代表提示语,本文将使用简单示例为您提供有关 Linux 命令提示符环境变量的快速入门。

1. PS1——默认交互提示

Linux 上的默认交互式提示可以如下所示修改为有用和信息丰富的内容。在下面的例子中,默认的 PS1 是“\s-\v\$”,它显示了 shell 名称和版本号。让我们更改此默认行为以显示用户名、主机名和当前工作目录名称,如下所示。

-bash-3.2$  export PS1="\u@\h \w> "

ramesh@dev-db ~> cd /etc/mail
ramesh@dev-db /etc/mail>
[Note: Prompt changed to "username@hostname current-dir>" format] 

本示例中使用以下 PS1 代码:

  • \u - 用户名
  • \h – 主机名
  • \w - 当前目录的完整路径名。请注意,当你在home目录时,这只会显示~如上图
  • 请注意,PS1 的值末尾有一个空格。就个人而言,我更喜欢在提示末尾留一个空格以提高可读性。

通过将 export PS1=”\u@\h \w> ” 添加到 .bash_profile (或) .bashrc 来使此设置永久化,如下所示。

ramesh@dev-db ~> vi ~/.bash_profile (or)
ramesh@dev-db ~> vi ~/.bashrc
[Note: Add export PS1="\u@\h \w> " to one of the above files]

2. PS2 – 续作互动提示

一个很长的 unix 命令可以通过在行尾给出 \ 来分解成多行。多行命令的默认交互式提示是“>”。让我们使用 PS2 环境变量更改此默认行为以显示“continue->”,如下所示。

ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
> --key_buffer_size=512M --sort_buffer_size=512M \
> --read_buffer_size=4M --write_buffer_size=4M \
> /var/lib/mysql/bugs/*.MYI
[Note: This uses the default ">" for continuation prompt]
ramesh@dev-db ~> export PS2="continue-> "

ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
continue-> --key_buffer_size=512M --sort_buffer_size=512M \
continue-> --read_buffer_size=4M --write_buffer_size=4M \
continue-> /var/lib/mysql/bugs/*.MYI
[Note: This uses the modified "continue-> " for continuation prompt]

当我使用 \ 将长命令分成多行时,我发现它非常有用且易于阅读。我还看到其他人不喜欢分解长命令。你的偏好是什么?你喜欢把长命令分成多行吗?


3. PS3 – shell 脚本中“select”使用的提示

您可以使用 PS3 环境变量为 shell 脚本内的选择循环定义自定义提示,如下所述。

没有 PS3 的 Shell 脚本和输出:

ramesh@dev-db ~> cat ps3.sh

select i in mon tue wed exit
do
  case $i in
    mon) echo "Monday";;
    tue) echo "Tuesday";;
    wed) echo "Wednesday";;
    exit) exit;;
  esac
done

ramesh@dev-db ~> ./ps3.sh

1) mon
2) tue
3) wed
4) exit
#? 1
Monday
#? 4
[Note: This displays the default "#?" for select command prompt]


Shell 脚本和输出 WITH PS3:

ramesh@dev-db ~> cat ps3.sh

PS3="Select a day (1-4): "
select i in mon tue wed exit
do
  case $i in
    mon) echo "Monday";;
    tue) echo "Tuesday";;
    wed) echo "Wednesday";;
    exit) exit;;
  esac
done

ramesh@dev-db ~> ./ps3.sh
1) mon
2) tue
3) wed
4) exit
Select a day (1-4): 1
Monday
Select a day (1-4): 4
[Note: This displays the modified "Select a day (1-4): "
       for select command prompt]

4. PS4 – 被“set -x”用来作为跟踪输出的前缀

PS4 shell 变量定义了在调试模式下执行 shell 脚本时显示的提示,如下所示。

没有 PS4 的 Shell 脚本和输出:

ramesh@dev-db ~> cat ps4.sh

set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~

ramesh@dev-db ~> ./ps4.sh

++ echo 'PS4 demo script'
PS4 demo script
++ ls -l /etc/
++ wc -l
243
++ du -sh /home/ramesh
48K     /home/ramesh
[Note: This displays the default "++" while tracing the output using set -x]


Shell脚本和输出WITH PS4:
ps4.sh下面定义的PS4有以下两个代码:

  • $0 - 表示脚本名称
  • $LINENO – 显示脚本中的当前行号
ramesh@dev-db ~> cat ps4.sh

export PS4='$0.$LINENO+ '
set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~

ramesh@dev-db ~> ./ps4.sh
../ps4.sh.3+ echo 'PS4 demo script'
PS4 demo script
../ps4.sh.4+ ls -l /etc/
../ps4.sh.4+ wc -l
243
../ps4.sh.5+ du -sh /home/ramesh
48K     /home/ramesh
[Note: This displays the modified "{script-name}.{line-number}+"
       while tracing the output using set -x]

5. PROMPT_COMMAND

Bash shell 在显示 PS1 变量之前执行 PROMPT_COMMAND 的内容。

ramesh@dev-db ~> export PROMPT_COMMAND="date +%k:%m:%S"
22:08:42
ramesh@dev-db ~>
[Note: This displays the PROMPT_COMMAND and PS1 output on different lines]

如果要在与 PS1 相同的行中显示 PROMPT_COMMAND 的值,请使用 echo -n ,如下所示。

ramesh@dev-db ~> export PROMPT_COMMAND="echo -n [$(date +%k:%m:%S)]"
[22:08:51]ramesh@dev-db ~>
[Note: This displays the PROMPT_COMMAND and PS1 output on the same line]
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。