13. PS1-4 和 PROMPT_COMMAND


如上一节所述,可以使用 PS1 将 Linux 上的默认交互式提示修改为有用且信息丰富的内容。

在以下示例中,默认 PS1 \s-\v\$,它显示 shell 名称和版本号。 让我们更改此默认行为以显示用户名、主机名和当前工作目录名称:

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

ramesh@dev-db /etc/mail$

一个很长的 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 环境变量为 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 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

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$