Linux中自动切换显示目录的长度

前几天还了一台服务器做了些事,毕竟不在自己配置的机子上就需要熟悉他人配置的环境,接触一下新的东西,其中终端上一个特性吸引了我:终端只显示当前目录,上层的所有目录都不显示,这个查了下很容易做到。

基础版

修改~/.bashrc文件的PS1变量:

1
2
3
4
5
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\W\$ '
fi

测试一下就可以知道采用的是第二个PS1,只是简单的把\u@\h:\w\中的小写w改成大小的W就好,具体的规定如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
\u 用户名
\h 主机名第一部分
\H 主机名全称
\w 当前工作目录(如 “/home/username/mywork”)
\W 当前工作目录的“基名 (basename)”(如 “mywork”)
\t 24 小时制时间
\T 12 小时制时间
\@ 带有 am/pm 的 12 小时制时间
\d “Sat Dec 18″ 格式的日期
\s shell 的名称(如 “bash”)
\v bash 的版本(如 2.04)
\V Bash 版本(包括补丁级别)
\n 换行符
\r 回车符
\\ 反斜杠
\a ASCII 响铃字符(也可以键入 07)
\e ASCII 转义字符(也可以键入 33)
\[ 这个序列应该出现在不移动光标的字符序列(如颜色转义序列)之前。它使bash能够正确计算自动换行。
\] 这个序列应该出现在非打印字符序列之后。

加强版

上面配置的是终端全部显示最后一级目录,这样咋能行呢,路径深了都不知道是怎么进来的,虽说有pwd,但也太不直观了,如果能够根据路径长度自动决定显示路径的深度该多好啊,比如路径深度小的时候显示全路径,路径深度大时显示最后几级路径,这样应该就完美了吧…..

嗯嗯,google/baidu/github….

嗨,竟然没有实现我这种想法的原型…..桑心

自己来吧………

这个手脚应该动在哪呢?

PS1上?这个在.bashrc文件中,可这个文件不能老是被执行啊,不行

cd上?每次cd执行之后自动获取当前目录的深度,并重新设置PS1,嗯嗯,可行….动手吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

command="cd "
for arg in "$*"
do
command=${command}" $arg"
done
$command

#echo ${\#PWD} # 这里因为hexo的原因多加了个\
pwd_len=${\#PWD} # 这里因为hexo的原因多加了个\
((std_len=14+60)) # 65 halfscreen
#echo std_len:$std_len
if [ $pwd_len -ge $std_len ]; then
keep_str=${PWD:22-$std_len:$pwd_len}
#echo $keep_str
keep_str=${keep_str#*/}

export PS1='${debian_chroot:+($debian_chroot)}\u@\h:$keep_str\$ '
else
export PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

挺好,完美!

执行试下,嗨,不行啊,这个脚本会在后台开个终端,cd到的目录并不更改当前终端的路径啊

用source来解决吧…..

这里还真纠结了下:

  1. source的脚本可以带有参数,意外;
  2. 放在.bashrc中参数竟然还能传递过去,意外的惊喜。

所以呢,在.bashrc中加入一句话:

1
alias cd="source /mnt/hdd2/yanan/bin/cd.sh"

source ~/.bashrc,ok!搞定手工。

Brick wechat
扫一扫,用手机看更方便(^ ◕ᴥ◕ ^)