4.2. 提示符中的外部命令

你也可以直接在提示符中使用常规 Linux 命令的输出。显然,你不想插入过多的内容,否则会创建一个很大的提示符。你还需要使用快速的命令,因为它会在每次提示符出现在屏幕上时执行,并且在工作时提示符出现延迟会非常烦人。(与之前非常相似的示例不同,这在 Bash 1.14.7 中确实有效。)

[21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ "
[2159][giles@nikola:~]$ ls
bin   mail
[2200][giles@nikola:~]$

重要的是要注意命令替换中美元符号之前的反斜杠。如果没有它,外部命令只会被执行一次:当 PS1 字符串被读取到环境中时。对于这个提示符,那意味着无论提示符使用多久,它都会显示相同的时间。反斜杠保护 $() 的内容免受立即的 shell 解释,因此每次生成提示符时都会调用 date

Linux 自带了很多小的实用程序,例如 dategrepwc,它们允许你操作数据。如果你发现自己试图在提示符中创建这些程序的复杂组合,那么创建你自己的别名、函数或 shell 脚本,并从提示符中调用它可能会更容易。在 bash shell 脚本中,通常需要转义序列来确保 shell 变量在正确的时间扩展(如上面 date 命令所见):这在提示符 PS1 行中被提升到另一个级别,通过创建函数来避免它是好主意。

下面给出了一个在提示符中使用的小型 shell 脚本的示例

#!/bin/bash
#     lsbytesum - sum the number of bytes in a directory listing
TotalBytes=0
for Bytes in $(ls -l | grep "^-" | awk '{ print $5 }')
do
    let TotalBytes=$TotalBytes+$Bytes
done
TotalMeg=$(echo -e "scale=3 \n$TotalBytes/1048576 \nquit" | bc)
echo -n "$TotalMeg"

我过去常常将其作为一个函数来保存,但现在它作为 shell 脚本存在于我的~/bin目录,它在我的路径中。在提示符中使用

[2158][giles@nikola:~]$ PS1="[\u@\h:\w (\$(lsbytesum) Mb)]\$ "
[giles@nikola:~ (0 Mb)]$ cd /bin
[giles@nikola:/bin (4.498 Mb)]$