0%

深入研究Linux内核

Linux系统的核心成为内核kernel,内核控制计算机上的所有硬件和软件,并在必要的时候分配硬件,在需要时执行软件。

内核主要有以下4中功能:

系统内存管理

内存管理是操作系统内核的主要功能之一,内核不仅可以管理服务器上可用的物理内存,而且能够创建并管理虚拟内存,或者说非实际存在的内存。内存管理必须要使用硬盘空间,该空间成为交换空间swap space,内核不断地在交换空间和实际物理内存之间交换虚拟内存位置的内容,这样系统认为可用的内存比实际存在的内存多。使用ipcs可以查看系统当前的共享内存分页。

软件程序管理

Linux操作系统将正在运行的程序成为进程,进程可以在前台运行,也可以在后台运行,内核控制Linux系统如何管理在系统中运行的所有进程。内核创建的第一个进程,成为初始进程init process,该进程可在系统上启动所有其他进程,内核启动时,它将初始进程加载到虚拟内存中。内核每启动一个其他进程,都将在虚拟内存中为其分配一个唯一的空间,用于存储该进程使用的数据和代码。

硬件管理

Linux系统需要与之通信的设备都必须在内核代码中插入驱动程序代码、驱动程序代码使内核能够向设备传输数据,它的作用就像是应用程序与硬件之间的中间人、在Linux内核中插入设备驱动程序代码有两种方法:

  • 在内核中编译驱动程序;
  • 向内核添加驱动程序模块;

目前Linux系统将硬件设备标示为特殊文件,成为设备文件,大致分为3类:

  • 字符设备
  • 主要用于哪些一次仅处理一个字符的设备,比如调制解调器和终端类型
  • 块设备
  • 主要用于哪些一次可以处理大量数据块的设备,比如磁盘驱动器
  • 网络设备
  • 主要用于使用数据包发送和接收数据的设备,包括网卡和特殊的回路设备,允许Linux系统使用通用网络编程协议与自身通信。

文件系统管理

Linux内核可以使用不同类型的文件系统与硬盘传输数据,Linux内核使用虚拟文件系统(Virtual File System,VFS)与每个文件系统进行连接。这为内核与其他文件系统类型的通信提供了一个标准接口。

GNU实用程序

除了使用内核控制硬件设备外,计算机操作系统还需要使用程序执行标准功能,所以,除了Linux系统内核,我们还需要一些系统实用程序。

GNU组织(GNU代表GNU’s Not Unix)开发了一个完整的Unix使用程序集,这些实用程序的开发基于一种新的软件思想,成为开源软件(OSS)。

Linus的Linux内核与GNU操作系统实用程序的结合诞生了一个完整的、功能强大的免费操作系统。所有Linux实际上应该是GNU/Linux。

核心GNU实用程序成为coreutils软件包,主要包括:

  • 处理文件的实用程序;
  • 操作文本的实用程序;
  • 管理进程的实用程序;

Shell是一个特殊的交互式使用程序,它为用户提供了一种启动程序、管理文件系统中的文件和管理运行在Linux系统上的进程的方式。Shell的核心是命令提示符,命令提示符是shell用于交互的组成部分,它允许输入文本命令,解释命令,然后再内核中执行命令。

目前大部分发行版默认的是Bash shell,当然还有很多shell版本。

Shell 描述
ash ash shell是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。
bash bash是Linux系统默认使用的shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,内部命令一共有40个(可使用help命令查看)。Linux使用它作为默认的shell是因为它有诸如以下的特色: 可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令; 自动通过查找匹配的方式给出以某字符串开头的命令; 包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。
ksh ksh是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。
csh csh是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说,csh其实就是tcsh
zsh zch是Linux最大的shell之一,由Paul Falstad完成,共有84个内部命令。如果只是一般的用途,是没有必要安装这样的shell的。

查看目录命令pwd

pwd命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径。

官方定义为:

pwd - print name of current/working directory

所以pwdPrint Working Directory第一个字的缩写。

唯二需要了解的参数如下:

  • -L, --logical:打印逻辑路径,与pwd一致
  • -P, --physical:打印物理路径,这里可以从超级链接直达原处

实例展示

此时比如我们进入一个目录,然后在打印出来,如下:

1
2
3
4
$ cd /etc/sysconfig/network-scripts/

$ pwd
/etc/sysconfig/network-scripts

可以看到pwd将输出完全路径

逻辑与物理路径

比如如下:

1
2
3
4
5
6
7
$ pwd
/opt/test

$ ls -l
总用量 1
lrwxrwxrwx 1 root root 14 Jan 15 2012 dir -> source/dir
drwxrwxrwx 1 root root 14 Jan 15 2012 source

可以看到此时的路径在/opt/test/里面有两个目录sourcedir,其中dir链接到source里面的dir。

接下来对比一下-L和-P的区别。

1
2
3
4
5
6
7
8
9
10
$ cd dir

$ pwd
/opt/test/dir

$ pwd -L
/opt/test/dir

$ pwd -P
/opt/test/source/dir

从上面的输出可以发现,-P参数会显示文件最原始的路径;而-L则是逻辑上的路径。

查看目录命令pwd

pwd命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径。

官方定义为:

pwd - print name of current/working directory

所有pwdPrint Working Directory第一个字的缩写。

唯二需要了解的参数如下:

  • -L, --logical:打印逻辑路径,与pwd一致
  • -P, --physical:打印物理路径,这里可以从超级链接直达原处

实例展示

此时比如我们进入一个目录,然后在打印出来,如下:

1
2
3
4
$ cd /etc/sysconfig/network-scripts/

$ pwd
/etc/sysconfig/network-scripts

可以看到pwd将输出完全路径

逻辑与物理路径

比如如下:

1
2
3
4
5
6
7
$ pwd
/opt/test

$ ls -l
总用量 1
lrwxrwxrwx 1 root root 14 Jan 15 2012 dir -> source/dir
drwxrwxrwx 1 root root 14 Jan 15 2012 source

可以看到此时的路径在/opt/test/里面有两个目录sourcedir,其中dir链接到source里面的dir。

接下来对比一下-L和-P的区别。

1
2
3
4
5
6
7
8
9
10
$ cd dir

$ pwd
/opt/test/dir

$ pwd -L
/opt/test/dir

$ pwd -P
/opt/test/source/dir

从上面的输出可以发现,-P参数会显示文件最原始的路径;而-L则是逻辑上的路径。

监视系统统计信息

功能:监视磁盘空间,并在超过预定值以后发送邮件

  1. df输出
  2. 提取出根目录所在的行,也就是以/结尾的行:使用$df | sed –n ‘//$/p’
  3. 分离出此行上的百分比:$ df | sed –n ‘//$/p’ | gawk ‘{print $5}’
  4. 删除掉%,$ df | sed –n ‘//$/p’ | gawk ‘{print $5}’|sed ‘s/%//‘

所以我们可以创建一个脚本:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

#monitor available disk space

SPACE=`df | sed -n '/\/$/p' | gawk '{print $5}'|sed 's/%//'`

if [ $SPACE -ge 90 ]
then
echo "Disk space on root at $SPACE% used" | mail -s "Disk Warning" leo
fi

echo "Disk space on root at $SPACE% used"

然后我们就可以在cron中写入这个脚本的一些信息,保证每天或者每个月统计一下信息来查看是否已经超过了预警值而发送信息到邮箱。

谁在霸占资源

如果我们负责Linux服务器上的许多用户,需要经常查看谁在使用所有的磁盘空间。

第一步:使用du -s /home/命令,来列出各个文件和目录的磁盘使用情况。
第二部:其中的test不是我们需要的内容,则使用du -s /home/
|grep –v test
第三步,为了查看用户名,我们去掉路径:du -s /home/* |grep –v test |sed ‘//home///p’

接下来,如果有多个用户,可以使用du -s /home/* |grep –v test |sed ‘//home///p’|sort –g –r来排序,确定那个用户占用了较多的空间。

监视CPU和内存使用情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash

#script to capture system statistics



OUTFILE=/home/leo/capstats.csv

DATE=`date +%Y/%m/%d`

TIME=`date +%k:%M:%S`



TIMEOUT=`uptime`

VMOUT=`vmstat 1 2`



USERS=`echo $TIMEOUT | gawk ‘{print $4}’`

LOAD=`echo $TIMEOUT | gawk ‘{print $9}’ | sed ‘s/,//’`

FREE=`echo $VMOUT | sed -n ‘/[0-9]/p’ |sed -n ‘2p’ | gawk ‘{print $4}’`

IDLE=`echo $VMOUT | sed -n ‘/[0-9]/p’ |sed -n ‘2p’ | gawk ‘{print $15}’`



echo "$DATE,$TIME,$USER,$LOAD,$FREE,$IDLE" >> $OUTFILE

从这个脚本,我们就可以设置一些定期运行来查看系统状态的信息,然后我们就可以使用HTML的格式生成一些比较优雅好看的文档格式。这同样可以使用echo命令生成HTML头部的代码,使用gawk命令生成HTML代码数据,然后再次使用echo命令关闭表。

生成的报告,可以使用Mutt命令轻松发送到电子邮件。

小结
当你负责管理Linux系统时,不管是大型的多用户系统,还是自己的系统,都有许多需要监视的内容。与其大量搜索日志文件和手动运行命令,不如创建shell脚本来完成这些任务。

Happy New Year. Buddies

For now, I’v book my train ticket to my hometown on 18th Jan.

As it’s near to the traditional New Year of Chinese so there are more tasks for me. That’s why it’s a long time I haven’t update my website.

I’m glad that there are so many buddies love my blog, especailly the post about the pgplot & c programming.(This post is also some technical article I’v search and summerise , not write by myself. haha).

So thank U so much who have leave a reply to me.

使用结构化命令

原因:许多程序在脚本命令之间需要某种逻辑流控制。

使用if-then语句

最基本的结构化命令类型为if-then语句,格式为:

1
2
3
4
5
6
7
if command

then

command

fi

这里有一些困惑,如果if后面的命令运行成功(即返回的是0值),就会执行then后面的command的,相反,就会跳过。

比如,你可以搜索你的名字是否在passwd中

1
2
3
4
5
6
7
if grep leo /etc/passwd

then

echo “yeah , you are in the /etc/passwd file”

fi

if-then-else语句

上面的if-then只有一个选择,而这个可以有多个选择。

格式为:

1
2
3
4
5
6
7
8
9
10
11
if command

then

command

else

command

fi

嵌套if语句

使用else部分的另一种版本,成为elif

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if command

then

command

elif command

then

command

elif command

then

command

……

fi

test命令

test命令提供了一种检测if-then语句中不同条件的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if test condition

then

commands

fi

或者

if [condition]

then

commands

fi

test命令能够评估以下3类条件:

  • 数值比较
  • 字符串比较
  • 文件比较

数值比较

test命令最常用于比较两个数值。

  • test int1 -eq int2 判断是否相等
  • test int1 -ne int2 判断是否不等
  • test int1 -lt int2 判断是否小于
  • test int1 -le int2 判断是否不小于
  • test int1 -gt int2 判断是否大于
  • test int1 -ge int2 判断是否不大于

字符串比较

test也允许对字符串进行比较,执行字符串比较可能有点复杂。

  • test –n 字符串 字符串的长度非零
  • test –z 字符串 字符串的长度为零
  • test 字符串1=字符串2 字符串相等
  • test 字符串1!=字符串2 字符串不等
  • test 字符串1>字符串2 字符串1大于字符串2
  • test 字符串1<字符串2字符串1小于字符串2

字符串比较:

  • 大于和小于符号一定要转义,否则shell会将他们当做重定向符号,将字符串值看做文件名;
  • 大于和小于顺序与在sort命令中的顺序不同

文件比较

Shell脚本中最强大和最常用的一类比较。test命令能够测试linux文件系统上的文件状态和路径。

文件比较:-

  • -d file 检查file是否存在并且是一个目录
  • -e file 检查file是否存在
  • -f file 检查file是否存在并且是一个文件
  • -r file 检查file是否存在并且可读
  • -s file 检查file是否存在并且不为空
  • -w file 检查file是否存在并且可写
  • -x file 检查file是否存在并且可执行
  • -0 file 检查file是否存在并且被当前用户拥有
  • -G file 检查file是否存在并且默认组是否为当前用户组
  • file1 -nt file2 检查file1是否比file2新
  • file1 -ot file2 检查file1是否比file2旧

复合条件检查

if-then语句可以使用布尔逻辑来合并检查条件,可以使用两个布尔操作符:

  • [condition1] && [condition2]
  • [condition1] || [condition2]

if-then的高级特征

Bash shell中最近增加了两个比较新的功能,它们提供了可以在if-then语句中使用的高级功能:

  • 双圆括号表示数学表达式
  • 双方括号表示高级字符串处理函数

使用双圆括号

双圆括号命令允许在比较中包含高级数学公式。双圆括号命令提供更多的数学符号,这些符号是其他语言程序员习惯使用的符号。格式为:

((expression))

双圆括号命令符号

  • val++ 后增量
  • val– 前减量
  • ++val 前增量
  • –val 后减量
  • ! 逻辑否定
  • ~ 逐位取反
  • ** 取幂
  • << 逐位左移
  • 逐位右移

  • & 逐位布尔逻辑与
  • | 逐位布尔逻辑或
  • && 逻辑与
  • || 逻辑或

使用双方括号

双方括号命令为字符串比较提供了高级功能,它提供了test命令没有的另一个功能,即模式匹配。例如

1
2
3
4
5
6
7
8
9
10
11
if [[ $USER == r*]]

then

echo “hello $USER

else

echo “Sorry, I do not know you”

fi

case命令

替代if-then-elif,提供了一种为每个可能的变量值指定不同选项的更清楚的方法。

格式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
case variable in

pattern1 | pattern2) command1;

pattern3) command2;

……

patternN) commandN;

*) default commands;

esac

关于NTP

对于执行ntpdate而没有这个命令的,估计是ntp的相关包没有安装,在fedora下,使用下述命令即可将ntp和ntpdate安装上

1
yum install ntp

同步

不过,注意使用它ntpdate的时候需要在root账户下。

1
2
3
[root@localhost]# ntpdate 129.7.1.66

29 Aug 21:38:13 ntpdate[822]: adjust time server 129.7.1.66 offset0.011426 sec

看来偶的机器与国家授时中心的就差了11ms,看来哥也是一个授时的人,哈哈。

NTP时间服务器

下面是几个通用的NTP时间服务器:

  • 129.7.1.66ntp-sop.inria.frserver 210.72.145.44(中国国家授时中心服务器IP地址)
  • ntp.sjtu.edu.cn (上海交通大学网络中心NTP服务器地址)
  • 202.120.2.101 (上海交通大学网络中心NTP服务器地址)
  • time.nist.gov
  • ntp.fudan.edu.cn (复旦)
  • timekeeper.isi.edu
  • subitaneous.cpsc.ucalgary.ca
  • usno.pa-x.dec.com
  • time.twc.weather.com
  • swisstime.ethz.ch
  • ntp0.fau.de
  • ntp3.fau.de
  • time-a.nist.gov
  • time-b.nist.gov
  • time-nw.nist.gov
  • nist1-sj.glassey.com
  • ntp.aliyun.com

具体的操作步骤就是ntpdate 加上上面的随笔一个NTP时间服务器就OK了。

Linux时间简介

在Windwos中,系统时间的设置很简单,界面操作,通俗易懂。而且设置后,重启,关机都没关系。系统时间会自动保存在Bios的时钟里面,启动计算机的时候,系统会自动在Bios里面取硬件时间,以保证时间的不间断。

但在Linux下,默认情况下,系统时间和硬件时间,并不会自动同步。在Linux运行过程中,系统时间和硬件时间以异步的方式运行,互不干扰。硬件时间的运行,是靠Bios电池来维持,而系统时间,是用CPU tick来维持的。

在系统开机的时候,会自动从Bios中取得硬件时间,设置为系统时间。

为了将系统时间写入BIOS,可以使用hwclock或者clock命令。其中,clock和hwclock用法相近,只用一个就行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。

系统时间和硬件时间的同步

1
2
3
4
5
6
7
//以系统时间为基准,修改硬件时间
[root@localhost ~]# hwclock –systohc <== sys(系统时间)to(写到)hc(Hard Clock)
[root@localhost ~]# hwclock -w

//以硬件时间为基准,修改系统时间
[root@localhost ~]# hwclock –hctosys
[root@localhost ~]# hwclock -s

ntpd和ntpdate的区别

为了避免主机时间因为长期运作下所导致的时间偏差,进行时间同步(synchronize)的工作是非常必要的。Linux系统下,一般使用ntp服务器来同步不同机器的时间。一台机器,可以同时是ntp服务器和ntp客户机。在网络中,推荐使用像DNS服务器一样分层的时间服务器来同步时间。

同步时间,可以使用ntpdate命令,也可以使用ntpd服务。

使用ntpdate比较简单。格式如下:

1
2
3
[root@linux ~]# ntpdate [-nv] [NTP IP/hostname]
[root@linux ~]# ntpdate 192.168.0.2
[root@linux ~]# ntpdate time.ntp.org

但这样的同步,只是强制性的将系统时间设置为ntp服务器时间。如果cpu tick有问题,只是治标不治本。所以,一般配合cron命令,来进行定期同步设置

比如,在crontab中添加:

1
0 12 * * * * /usr/sbin/ntpdate 192.168.0.1

这样,会在每天的12点整,同步一次时间。ntp服务器为192.168.0.1。

使用ntpd服务,要好于ntpdate加cron的组合。因为,ntpdate同步时间,会造成时间的跳跃,对一些依赖时间的程序和服务会造成影响。比如sleep,timer等。而且,ntpd服务可以在修正时间的同时,修正cpu tick。理想的做法为,在开机的时候,使用ntpdate强制同步时间,在其他时候使用ntpd服务来同步时间

要注意的是,ntpd 有一个自我保护设置: 如果本机与上源时间相差太大, ntpd 不运行. 所以新设置的时间服务器一定要先 ntpdate 从上源取得时间初值, 然后启动 ntpd服务。ntpd服务 运行后, 先是每64秒与上源服务器同步一次, 根据每次同步时测得的误差值经复杂计算逐步调整自己的时间, 随着误差减小, 逐步增加同步的间隔. 每次跳动, 都会重复这个调整的过程.

所以:ntpd不仅仅是时间同步服务器,他还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,并非ntpdate立即同步,在生产环境中慎用ntpdate,也正如此两者不可同时运行。

时钟的跃变,对于某些程序会导致很严重的问题。许多应用程序依赖连续的时钟——毕竟,这是一项常见的假定,即,取得的时间是线性的,一些操作,例如数据库事务,通常会地依赖这样的事实:时间不会往回跳跃。不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday(2)设置系统时间,这有几个非常明显的问题:

  • 这样做不安全。ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。
  • 这样做不精确。一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。
  • 这样做不够优雅。由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。

因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。

NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差——或者说 Local Clock 的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时。

使用Linux环境变量

什么是环境变量

bash shell使用一种称为环境变量的特性来存储关于shell会话和工作环境的信息(环境变量的名称由此而来)。该特性还允许你将数据存储在内存中,以便于在shell中运行的程序和脚本访问它们。这是一种便捷的、用于存储持久性数据的方式,这些数据可以标示用户账户、系统、shell或任何需要存储的内容的特性。

bash shell中共有两种类型的环境变量:

  • 全局变量;
  • 本地变量;

全局环境变量

要查看全局变量,可以使用printenv命令。

通过该命令的输出,我们可以看到bash shell已经设置了许多全局环境变量,其中大多数由系统在登录过程中设置。

本地环境变量

本地环境变量只在定义它们的本地进程中可见。可以通过set命令显示特定进程的所有环境变量集。这其中包含了全局环境变量和本地环境变量。

设置环境变量

设置本地环境变量

为环境变量分配一个数值或者字符串,方法是使用等号将变量指定为具体值。

例如

1
$ test=hello,

那么我们使用

1
$ echo $test

就可以输出hello。

当然如果赋值为一个字符串,需要用单引号括起来,否则空格后的字符会被认为是命令而出错。

如果创建新环境变量,建议(但不要求)使用小写字母。这用助于区分个人环境变量与系统环境变量。

设置全局环境变量

创建全局变量的方法是创建一个本地环境变量,然后使用export将它导出到全局环境中。

移除环境变量

可以使用unset命令来移除环境变量,在unset命令中引用环境变量时,不要使用美元符号。

默认的shell环境变量

  1. BASH :记录当前bash shell的路径。
1
2
[root@localhost awK]# echo $BASH
/bin/bash
  1. BASH_SUBSHELL :记录当前子shell的层次。BASH_SUBSHELL是从0开始计数的整数。
  2. BASH_VERSINFO :是一个数组包含六个元素,这六个元素显示bash的版本信息。
  3. BASH_VERSION :显示shell版本的信息。
  4. DIRSTACK :记录了栈顶的目录值,初值为空。
  5. GLOBLGNORE :是由冒号分割的模式列表,表示通配时忽略的文件名集合。
  6. GROUPS :记录当前用户所属的组。
  7. HOME :记录当前用户的家目录,由/etc/passwd的倒数第二个域决定。
  8. HOSTNAME :记录主机名。
  9. HOSTTYPE和MACHTYPE :都是记录系统的硬件架构。
  10. IFS :用于设置指定shell域分隔符,默认情况下为空格。
1
2
3
[root@localhost awK]# export IFS=:
[root@localhost awK]# echo $PATH
/usr/local/sbin /usr/local/bin /sbin /bin/usr/sbin /usr/bin /root/bin
  1. OLDPWD :记录旧的工作目录。
  2. OSTYPE :记录操作系统类型。
  3. PATH :环境变量,显示当前PATH环境变量的内容。
  4. PPID :是创建当前进程的进程号,即当前进程的父进程号
  5. PS1 :提示符变量,用于设置提示符格式,用于设置一级shell提示符环境变量。
  6. PS2 :用于设置二级shell提示符环境变量。
  7. PWD :记录当前路径
  8. REPLY :REPLY变量与read和select有关。
  9. SECONDS:记录脚本从开始到结束耗费的时间。
  10. SHELL :显示当前所用的shell
  11. SHELLOPTS :记录了处于“开”状态的shell选项列表,它只是一个只读变量。
  12. SHLVL :记录了bash嵌套的层次,一般来说,我们启动第一个Shell时。 $SHLVL=1。如果在这个Shell中执行脚本,脚本中的$SHLVL=2 。
  13. TMOUT :用来设置脚本过期的时间,比如TMOUT=3,表示该脚本3秒后过期。
  14. UID : 已登用户的ID
  15. USER :显示当前用户名字

注意:使用set命令时,并非所有的默认环境变量都会显示出来,因为有些默认的环境变量时不需要赋值的。

设置PATH环境变量

增加环境变量的方法为export PATH=$PTAH:/the/path/you/want/to/add;

有时我们可以使用PATH=$PATH:. 临时让当前目录添加到PATH变量中,可以执行当前目录的程序而不用添加./。 ,不错哟。

定位系统环境变量

Bash shell将查找下面的文件用来处理登录shell的设置:

  • /etc/profile : 是系统上的主默认启动文件,系统上的每一个用户在登录时都将执行此启动文件,比如安装了什么软件,需要每个人都使用,那么需要将环境变量设置在该文件。
  • $HOME/.bash_profile
  • $HOME/.bash_login
  • $HOME/.profile 上面的3个启动文件主要特定于各个用户,这应该叫井水不犯河水。
  • $HOME/.bashrc 该文件为交互式shell启动时处理的。

变量数组

可以使用

1
$ mytest=(one two three four five)

为某个环境变量设置多个值,但是在显示的时候,如果使用

1
$echo $mytest

那么只会出现one,而是用$echo ${mytest[1]},则显示two,可以使用 $echo ${mytest[*]}显示所有的值。

使用命令别名

命名别名允许您为公共命令以及它们的参数创建别名,以尽可能减少录入工作。

因为我们知道,在启动新的交互式的shell时,bash shell始终会读取.bashrc启动文件,所以我们可以把别名放在该文件中。

用C语言开发图形界面

在浏览linuxquestions的时候,看到一篇关于Graphics Programming on linux using C的帖子,感觉不错,特来分享一下。

现在关于图形开发的VC,C#,java,QT等IDE大行其道。不过还是有一部分默默无闻的人偏爱着用pure代码来描绘着自己的世界。

我这里推荐几个,大家可以search一下相关的内容,下面即为keyword。

  • OpenGL
  • PGPLOT
  • GTK
  • KDE
  • GLUT
  • FLTK
  • ncurses
  • xlib
  • QT
  • SDL等

更多信息

SDL

SDL is a good library and used by game developers.

##OpenGL

You can also use OpenGL for 3d stuff, but be warned that performance will be poor unless X use 3d accelerated drivers. Otherwise it will use Mesa indirect.

svgalib

svgalib is easy to use, but people tend to overlook it because it doesn’t fit in well with the modern X graphics paradigm. I have a program (experix project in sourceforge) that plots graphs and writes text using a svgalib-based graphics server.

GTK+

GTK+: can be a little overwelming but I was able to understand it a lot better than xlib. It is slower tho i will admit.

never tried svgalib before but thanks for the link ill have to check that out.

GTK+: will confuse you on all its diffrent versions as well and for larger apps it can get a little confusing on what does what or how this is related to that.

ncurses

ncurses: is cool but can be a freekin nightmare. i still dont understand colums
and rows

Qt

Qt: dont know anything about this think i made a program with it before i Knew anything about C

xlib

xlib: Try if you dare you might find it more understandable then me. Never could get my hello world program to display.