13. PS1-4 和 PROMPT_COMMAND
PS1
– 默认交互式提示符
如上一节所述,可以使用
PS1
将 Linux 上的默认交互式提示修改为有用且信息丰富的内容。
在以下示例中,默认
PS1
为\s-\v\$
,它显示 shell 名称和版本号。
让我们更改此默认行为以显示用户名、主机名和当前工作目录名称:
bash-4.1$ export PS1="\u@\h \w$ "
ramesh@dev-db /etc/mail$
PS2
– 延续交互提示符
一个很长的 UNIX 命令可以通过在行尾给出\
分成多行。 我发现使用\
将长命令分成多行非常有用且易于阅读。
我见过其他人不喜欢分解长命令。
多行命令的默认交互式提示是>
。 让我们使用
PS2
环境变量更改此默认行为以显示continue->
,如下所示。
使用默认的>
作为继续提示:
$ 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
使用修改后的continue->
作为继续提示:
$ export PS2="continue-> "
$ 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
PS3
– select
命令内部 shell 脚本使用的提示符
您可以使用
PS3
环境变量为 shell 脚本内的select
循环定义自定义提示,如下所述。
没有
PS3
的 Shell 脚本和输出:(这会显示select
命令提示符的默认形式#?
)
$ 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
$ ./ps3.sh
1) mon
2) tue
3) wed
4) exit
#? 1
Monday
#? 4
定义了
PS3
的 Shell 脚本和输出:
$ cat ps3-1.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
$ ./ps3-1.sh
1) mon
2) tue
3) wed
4) exit
Select a day (1-4): 1
Monday
Select a day (1-4): 4
select
命令提示符修改后的"Select a day (1-4): "
PS4
– set -x
使用提示符为跟踪输出添加前缀
PS4
shell 变量定义在调试模式下执行 shell 脚本时显示的提示符,如下所示。
没有自定义
PS4
的 Shell 脚本和输出显示默认的++
:
$ cat ps4.sh
set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~
$ ./ps4.sh
++ echo 'PS4 demo script'
PS4 demo script
++ ls -l /etc/
++ wc -l
243
++ du -sh /home/ramesh
48K /home/ramesh
示例 shell 脚本和带有自定义
PS4
的输出在跟踪输出时显示修改后的{script-name}.{line-number}+
。
下面在ps4.sh
中定义的
PS4
有以下两个代码:
$0
– 表示脚本名称$LINENO
– 显示脚本中的当前行号
$ cat ps4.sh export PS4='$0.$LINENO+ ' set -x echo "PS4 demo script" ls -l /etc/ | wc -l du -sh ~ $ ./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
PROMPT_COMMAND
Bash shell 在显示
PS1
之前执行
PROMPT_COMMAND
的内容。
此示例在不同的行上显示
PROMPT_COMMAND
和
PS1
输出。
$ export PS1="\u@\h \w$ "
$ export PROMPT_COMMAND="date +%k:%m:%S"
22:08:42
ramesh@dev-db /etc/mail$
如果要在与
PS1
相同的行中显示
PROMPT_COMMAND
的值,请使用 echo -n
,如下所示:
$ export PROMPT_COMMAND="echo -n [$(date +%k:%m:%S)]"
[22:08:51]ramesh@dev-db /etc/mail$