Bash Shell:控制 PS1、PS2、PS3、PS4 和 PROMPT_COMMAND
如果您有效地使用 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]
- 点赞
- 收藏
- 关注作者
评论(0)