自定义PS1
1.在提示符里输出用户名,主机名, 当前目录:
export PS1="\u@\h \W> "
其中:
\W
是当前目录的 basename, 也就是目录名, 不带绝对路径的.
其他的在之前已经说过, 不再重复.
2.在提示符里输出当前时间:
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
中存放着一个内容如下的脚本:
#!/bin/bash
for filesize in $(ls -l . | grep "^-" | awk '{print $5}')
do
let totalsize=$totalsize+$filesize
done
echo -n "$totalsize"
正如你所看到的, 这个脚本的作用是计算当前目录下文件的大小.
然后我们将PS1
的值改掉:export PS1="\u@\h [\$(totalfilesize.sh)
bytes]> "
那么每当你敲回车的时候都会看到当前目录下的文件总大小:
ramesh@dev-db [534 bytes]> cd /etc/mail
ramesh@dev-db [167997 bytes]>
PS:可以把脚本内容改成:
ls -l | awk '/^-/ { sum+=$5 } END { printf sum }'
这样会简练一些.