自定义PS1

1.在提示符里输出用户名,主机名, 当前目录:

  1. export PS1="\u@\h \W> "

其中:

  • \W 是当前目录的 basename, 也就是目录名, 不带绝对路径的.

其他的在之前已经说过, 不再重复.

2.在提示符里输出当前时间:

  1. export PS1="\u@\h [\$(date +%H:%M:%S)]> "

PS1中可以带命令, 正如上面的例子, 输出时便会附带当前时间.

上面的$(date +%H:%M:%S)可以替换为: \t

或者用\@输出当前的小时和分钟.

3.显示任何命令:

其实,这个说法并不是很准确, 因为自定义的命令不会运行, 除非像上一篇那样, 在外部定义了一个自己的命令, 否则, 只会输出第一次命令运行得到的结果, 听起来可能有点啰嗦, 你自己动手试一下就好了.

这里再多说几个:

……

妈蛋, 原作者说的都是些啥啊, 越来越水了… 没用的就不翻译了.

说点自己的经验:

  • 这些变量是类似于一个子shell运行的, 外部命令不会对内部产生影响
  • 变量可以是一条命令, 但是这条命令必须是系统自带的, 自己写的函数不会起作用.
  • 自己在外部写的函数会在里面被引用, 不知道是替换还是什么, 总之能够运行.
  • 不动手试一下你就不知道我说的是什么…

4.用内部已有的代码自定义PS1

如果你看过之前的那篇文章(Hack-38 的扩展阅读部分), 这里的东西就当是复习了.

先列举一下那些内部代码, 类似于\n代表换行符一样:

  • \a 响铃
  • \d 日期
  • \D{format} 自定义的日期
  • \e 逃逸字符
  • \h 主机名(前半部分)
  • \H 主机名(完整的)
  • \j 当前shell下的后台job数量, 相当于jobs
  • \l shell终端的basename… (这个都给定义了…
  • |n 换行
  • \r 你知道\r\n的区别嘛 (这个是回车, 上面的是换行哦~)
  • \s shell的名字
  • \t 24小时制的时间 - HH:MM:SS
  • \T 12小时制的时间 - HH:MM:SS
  • \@ 12小时制带上下午的时间 - am/pm (真啰嗦啊…
  • \A 24小时制的时间 - HH:MM
  • \u 当前用户名
  • \v 当前Bash的版本号 (我真是醉了…
  • \V Bash的发布版本号 4.3.42 (可以理解为较长的那个
  • \w 当前目录(绝对路径)
  • \W 当前目录的短名字 (可以理解为目录名
  • ! 这条命令在历史记录中的编号
  • # 这条命令在当前shell中的编号
  • \$ 如果$UID -eq 0那么这个就输出#, 否则输出$
  • \nnn nnn表示一个八进制的数字, 整体就表示这个八进制的字符
  • \ 一个反斜杠
  • [ 转义开中括号
  • ] 转义闭中括号

5.在PS1中运行自定义function

哈哈, 我翻译PROMPT_COMMAND那一部分的时候还没看到这里呢, 所以不算剧透哦, 因为我也不知道作者写了这一部分, 而且上面的在PS*变量中自定义功能可是我举一反三得来的哦~

所以, 这里作者说的是定义了一个外部function, 然后在从PS1里面调用.

这样你的选择就多了去了, 随你想干什么, bash 都满足你哦~ 哈哈~

6.在PS1中运行脚本

PS1变量中既然可以运行命令, 那么同样也可以运行脚本.

假如你在~/bin/totalfilesize.sh中存放着一个内容如下的脚本:

  1. #!/bin/bash
  2. for filesize in $(ls -l . | grep "^-" | awk '{print $5}')
  3. do
  4. let totalsize=$totalsize+$filesize
  5. done
  6. echo -n "$totalsize"

正如你所看到的, 这个脚本的作用是计算当前目录下文件的大小.

然后我们将PS1的值改掉:export PS1="\u@\h [\$(totalfilesize.sh)
bytes]> "

那么每当你敲回车的时候都会看到当前目录下的文件总大小:

  1. ramesh@dev-db [534 bytes]> cd /etc/mail
  2. ramesh@dev-db [167997 bytes]>

PS:可以把脚本内容改成:

  1. ls -l | awk '/^-/ { sum+=$5 } END { printf sum }'

这样会简练一些.