Bash csh 命令提示符颜色及其他
1.结果:参考了很多其他文章的介绍,完成自己的Linux PS1颜色设置:
2.设置文件:
用户是bash shell,vim ~/.bashrc,增加:
PS1='[/u@/e[0;36m/h/e[0m /W]/$'
export PS1
用户是c shell,vim ~/.cshrc,增加:
set colors_1 = "%{/e[0m%}"
#set colors0 = "%{/e[30m%}"
#set colors1 = "%{/e[31m%}"
#set colors2 = "%{/e[32m%}"
#set colors3 = "%{/e[33m%}"
#set colors4 = "%{/e[34m%}"
#set colors5 = "%{/e[35m%}"
set colors6 = "%{/e[36m%}"
#set colors7 = "%{/e[37m%}"
#set prompt="[%n@$colors7%B%m%b %c]%%"
set prompt="[%n@$colors6%m$colors_1 %c]%%"
#set prompt = "$colors1***** $colors2%/ $colors3*** $colors4<%U`whoami`%u@%m> $colors5*** $colors6%h$colors_1 $colors7***** $colors1%P $colors2***/n$colors3%%$colors_1 "
3. C shell 和Bash shell中的详细定义:
3.1)bash的提示符为 PS1 变量, 默认是 环境变量, 下面包含bash为用户在PS1中所使用的符号的一个完整列表:
/a ASCII 响铃字符(也可以键入 /007)
/d "Wed Sep 06" 格式的日期
/e ASCII 转义字符(也可以键入 /033)
/h 主机名的第一部分(如 "mybox")
/H 主机的全称(如 "")
/j 在此 shell 中通过按 ^Z 挂起的进程数
/l 此 shell 的终端设备名(如 "ttyp4")
/n 换行符
/r 回车符
/s shell 的名称(如 "bash")
/t 24 小时制时间(如 "23:01:01")
/T 12 小时制时间(如 "11:01:01")
/@ 带有 am/pm 的 12 小时制时间
/u 用户名
/v bash 的版本(如 )
/V Bash 版本(包括补丁级别) ?/td>;
/w 当前工作目录(如 "/home/drobbins")
/W 当前工作目录的“基名 (basename)”(如 "drobbins")
/! 当前命令在历史缓冲区中的位置
/# 命令编号(只要您键入内容,它就会在每次提示时累加)
/$ 如果您不是超级用户 (root),则插入一个 "$";如果您是超级用户,则显示一个 "#"
/xxx 插入一个用三位数 xxx(用零代替未使用的数字,如 "/007")表示的 ASCII 字符
// 反斜杠
/[ 这个序列应该出现在不移动光标的字符序列(如颜色转义序列)之前。它使 bash 能够正确计算自动换行。
/] 这个序列应该出现在非打印字符序列之后。
颜色是通过在 PS1 中添加专用序列来选择的 -- 基本上是夹在 "/e["(转义开方括号)和 "m" 之间数字值。如果指定一个以上的数字代码,则用分号将它们分开。
下面是一个颜色代码示例:
"/e[0m"
如果将数字代码指定为零,则它就会通知终端将前景、背景和加粗设置重置为它们的默认值。您可能会在提示行结束时使用这个代码,以使您键入的文字成为非彩色的。现在,让我们看一下这些颜色代码。请注意下面的抓屏结果:
颜色表
前景 背景 颜色
---------------------------------------
30 40 黑色
31 41 紅色
32 42 綠色
33 43 黃色
34 44 藍色
35 45 紫紅色
36 46 青藍色
37 47 白色
代码 意义
-------------------------
0 OFF
1 高亮显示
4 underline
5 闪烁
7 反白显示
8 不可见
要使用这个表,首先请查找您要使用的颜色,然后查找对应的前景编号 (30-37) 和背景编号 (40-47)。例如,如果您喜欢黑底绿字,则可将编号分别设为 32 和 40。然后打开您的提示行定义并在其中添加适当的颜色代码。
下面的定义:export PS1="/w> " 变为: export PS1="/e[32;40m/w> "
到现在为止,提示行尽管已经很不错了,但仍不太完美。在 bash 显示出工作目录以后,我们需要使用 "/e[0m" 序列将颜色重新设置为正常值。
export PS1="/e[32;40m/w> /e[0m"
3.2)tcsh/csh的设置。
我们可以使用的标记列表有:
! 跟%h一样
%B 开始粗体模式
%b 结束粗体
%c 当前工作目录名称的最后部分, 相当于basename $cwd 或者 ${cwd:tail} ${cwd:t}
%c2, %c3等等 最后2,3(等等)部分
%C 与%c类似,但是使用长形式
%d 本周的当天
%D 今天时当月中的第几天
%h 历史编号
%l shell的当前控制终端
%U 开始下划线
%u 结束下划线
%/ 完整目录名
%~ 短格式目录
%m 机器名
%n 登录名
%h 历史编号
%P %p %t %T 时间的不同形式。...
4.注意,
1. bash设置变量直接写 x="..."这样,但是tcsh要有set。 %{ %}就相当于bash下的/[ /]
2./etc/profile文件中修改环境变量,在这里修改的内容是对所有用户起作用的,但/etc/profile文件一旦修改错误,会导致系统启动错误,所以最好在/etc/profile.d中修改:
比如上述内容可以分别建立/etc/profile.d/ 和/etc/profile.d/定义所有用户的PS1.
修改用户根目录下.bashrc/.cshrc文件进行环境变量的编辑,只对当前用户有用
5.关于环境变量定义文件的载入先后顺序:
在登录Linux时要执行文件的过程如下:
在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个,执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。因为在 ~/.bash_profile文件中一般会有下面的代码:
if [ -f ~/.bashrc ] ; then
. ./bashrc
fi
if [ -f /etc/bashrc ] ; then
. /bashrc
fi
执行顺序为:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout
关于各个文件的作用域,在网上找到了以下说明:
(1)/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。
(2)/etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。
(3)~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
(4)~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
(5)~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。
(6)~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。
/etc/profile和/etc/environment等各种环境变量设置文件的用处
先将export LANG=zh_CN加入/etc/profile ,退出系统重新登录,登录提示显示英文。
将/etc/profile 中的export LANG=zh_CN删除,将LNAG=zh_CN加入/etc/environment,退出系统重新登录,登录提示显示中文。
用户环境建立的过程中总是先执行/etc/profile然后在读取/etc/environment。为什么会有如上所叙的不同呢?
应该是先执行/etc/environment,后执行/etc/profile。
/etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关。
系统应用程序的执行与用户环境可以是无关的,但与系统环境是相关的,所以当你登录时,你看到的提示信息,象日期、时间信息的显示格式与系统环境的LANG是相关的,缺省LANG=en_US,如果系统环境LANG=zh_CN,则提示信息是中文的,否则是英文的。
对于用户的SHELL初始化而言是先执行/etc/profile,再读取文件/etc/environment.对整个系统而言是先执行/etc/environment。这样理解正确吗?
/etc/enviroment --> /etc/profile --> $HOME/.profile -->$HOME/.env (如果存在)
/etc/profile 是所有用户的环境变量
/etc/enviroment是系统的环境变量
登陆系统时shell读取的顺序应该是
/etc/profile ->/etc/enviroment -->$HOME/.profile -->$HOME/.env
原因应该是jtw所说的用户环境和系统环境的区别了
如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值那应该是以用户环境为准了。
(1)/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。
(2)/etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。
(3)~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
(4)~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
(5) ~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。
(6)~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。