Shell中输出颜色和控制

       我们知道,使用ls命令列出文件列表时,不同的文件类型会用不同的颜色显示。那么如何实现这样带颜色的文本输出呢?答案并不复杂,不管是用shell还是C语言

一、shell下的实现方法

       先来讲在shell下,如何实现。用echo命令就可以实现,参看以下例子:

       echo  -e  "33[32mHello, world!"

       当你在终端里敲下这条命令后,是不是发现系统用绿色输出了"Hello,world!",不止如此,连之后的命令提示符都变成了绿色?不要着急,听我继续说。echo命令-e选项的作用是激活终端对反斜线转义符(即)的解释。引号内33用于引导非常规字符序列,在这里的作用就是引导设置输出属性,后边的[32m就是将前景色设置为绿色,字母m表示设置的属性类别,数字代表属性值。设置可以单独使用,例如:

       echo -e  "33[0m"

       这行命令的作用是恢复属性为默认值,也就是说0m设置项用于恢复默认值。现在你的终端是不是又一切正常了?

       理解了这些,剩下的就简单了。用这种命令,除了设置文本前景色,还可以设置很多属性。下边列出其他的设置项:

      --------------------------------------------------------------------------

      33[0m 关闭所有属性
     33[1m 设置高亮度
     33[4m 下划线
     33[5m 闪烁
     33[7m 反显
     33[8m 消隐
     33[30m 至 33[37m 设置前景色
     33[40m 至 33[47m 设置背景色
     33[nA 光标上移n行 
     33[nB 光标下移n行
     33[nC 光标右移n行
     33[nD 光标左移n行
     33[y;xH设置光标位置
     33[2J 清屏
     33[K 清除从光标到行尾的内容
     33[s 保存光标位置 
     33[u 恢复光标位置
     33[?25l 隐藏光标
     33[?25h 显示光标

      --------------------------------------------------------------------------

      各数字所代表的颜色如下:

      字背景颜色范围:40----49
     40:黑
     41:深红
     42:绿
     43:黄色
     44:蓝色
     45:紫色
     46:深绿
     47:白色

     字颜色:30-----------39
     30:黑
     31:红
     32:绿
     33:黄
     34:蓝色
     35:紫色
     36:深绿 
     37:白色

      另外,同类的多种设置项可以组合在一起,中间用分号(;)隔开。如下:

      echo -e "33[20;1H33[1;4;32mHello,world33[0m"

      这行命令首先33[20;1H将光标移动到终端第20行第1列,之后的33[1;4;32m将文本属性设置为高亮、带下划线且颜色为绿色,然后输出Hello,world;最后33[0m将终端属性恢复为默认值,这样就不会看到连命令完成后的命令提示符也变了样儿了。

      通过以上各种命令的组合就可以实现对终端输出地复杂控制。

二、如何在C编程中实现?

      理解了以上在Shell中的实现方法,关于在C中如何实现就很简单了。可以说只需要用printf函数代替上边的echo -e就OK了。参见下例:

      int color = 32;

      printf("33[20;1H33[1;4;%dmHello, world.33[0m", color);

      这个例子类似上边shell中最后那个例子,只是这里颜色值通过变量color来指定(当然,也可以直接指定)。

三、联想

      看到这里你可能会想,是不是在其他编程语言里也可以用类似的方法实现对终端输出的控制呢?答案是肯定的!比如在python中,可以如下输出:

      color=32

      print “33[20;1H33[1;4;%dHello, world.33[0m"%color

      这个例子的效果跟上边C的例子是相同的。

vmware 共享文件(hgfs)的问题(权限,用户)

centos中mount共享目录
  1. 虚拟机重启后,运行 lsmod | grep vm 命令来检测VMWare Tools是否正确启动
  2. mount共享目录:

    mount -t vmhgfs .host:/share-name /mnt/share-name

    也可以通过 /sbin/mount.vmhgfs 命令来mount

  3. 可以在 /etc/fstab 中添加如下条目,实现开机就 mount 共享目录

    .host:/share-name /mnt/share-name vmhgfs defaults 0 0

以上是在CentOS 6.5下设置的, 也就是内核版本小于3.x的linux下可以正确设置,但是到了CentOS 7.0这种设置无效,还会导致重启后/etc/fstab无法正确挂载而进入Emergency mode,没研究过内核,不懂什么原因。

mount -t vmhgfs .host:/projects /root/projects

这个命令也会出错提示(projects是我共享文件夹名称):

Could not add entry to mtab, continuing.

看了下/etc/mtab,倒数第二行已经挂载了,而最后一行是我刚才敲的.

.host:/  /mnt/hgfs  vmhgfs rw,relatime 0 0

.host:/projects /root/projects vmhgfs rw,relatime 0 0

/etc/mtab这个是指向/proc/self/mounts,这个文件是当前系统mount的信息,对所有人都是只读,虽然网上有修改手段,但是还是不打算修改,既然默认会mount到/mnt/hgfs,那一定是VMware tools写死了,chkconfig查看到vmware-tools 的启动服务:

[root@localhost ~]# chkconfig

iprdump            0:off    1:off    2:on    3:on    4:on    5:on    6:off
iprinit            0:off    1:off    2:on    3:on    4:on    5:on    6:off
iprupdate          0:off    1:off    2:on    3:on    4:on    5:on    6:off
netconsole         0:off    1:off    2:off    3:off    4:off    5:off    6:off
network            0:off    1:off    2:on    3:on    4:on    5:on    6:off
vmware-tools       0:off    1:off    2:on    3:on    4:on    5:on    6:off
vmware-tools-thinprint    0:off    1:off    2:on    3:on    4:on    5:on    6:off

直接修改这个脚本:

# vim /etc/init.d/vmware-tools

搜索/mnt/hgfs,可以看到在748行

vmhgfs_mnt=”/mnt/hgfs”

看来真的写死了, 在1030行挂载函数

# Mount all hgfs filesystems
vmware_mount_vmhgfs() {
if [ "`is_vmhgfs_mounted`" = "no" ]; then
vmware_exec_selinux "mount -t vmhgfs .host:/ $vmhgfs_mnt"
fi
}

这两处都修改下,reboot,OK。

既然可以mount过载就可以通过-o参数指定用户和用户组了,hgfs不再有任何权限问题。

参考资料:

VMware中CentOS 7.0设置文件夹共享

CentOS 菜单管理器删除Applications中的菜单项

有时候会错误的安装一些软件或手动删除了某些软件,但是在左上角的Applications菜单中还是会显示出来,让人很不爽。

现在介绍一个删除掉CentOS Applications中菜单项的方法:

1.安装alacarte软件    yum install alacarte

2. 安装完成后,点击左上角的 "System"菜单 选择 "Perferences'菜单,点击其中的"Main Menu"就会看到Applications中的菜单项了

3. 选中对应的菜单项右键将其删除掉就可以了