免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3733 | 回复: 17
打印 上一主题 下一主题

《UNIX编程环境》学习笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-26 09:50 |只看该作者 |倒序浏览
《UNIX编程环境》学习笔记

本笔记只记录个人比较感兴趣,或者不太明白的东西。
希望和大家一起讨论。有不对的地方也请指正

第1章:初学UNIX

主要是一些基本的Unix命令和shell的简单功能。

1.1 暂停输出
    指暂停屏幕上的标准输出。
   比如你要避免某些关键信息出现在屏幕上,可以按Ctrl+s。
   此时,你的输入和程序运行依然有效,只是所有的输出都看不见。
   按Ctrl+q可以继续暂停的输出。

   类似的应用在shell编程中,可以用stty -echo命令使得键盘输入不显示在标准输出上
   比如输入密码的之前,使用此命令。
   之后用stty echo恢复。

   这两者的不同:
   Ctrl+s是暂停所有的标准输出,包括键盘输入的回显,程序执行的输出
   Ctrl+q的时候,那些标准输出会出现。

   而stty -echo只是关闭了键盘输入引起的回显(echo)字符。
   stty echo停止的时候,之前键盘输入的字符不会出现。

   在以上两种情况下,键盘输入pwd的现象。
-----------------
Ctrl+s                           //先按Ctrl+s,再从键盘输入pwd,标准输出暂停,没有显示
#                                 
Ctrl+q                          //按Ctrl+q,之前暂停的键盘输入的回显和shell的信息都显示出来。
#pwd
/root                             
                                 
-----------------
# stty -echo
# /root                           //从键盘输入pwd,没有echo出来,但是pwd执行的信息还是会输出。
                         //然后摸黑输入stty echo。呵呵
#

1.2 用户间通信

   wall 给所有用户发送mesg。按Ctrl+D结束输入。

   write userb 给b用户发送mesg。如果b用户要回复a用户 write发过来的信息,
   输入write usera,就可以交互性的通信了。同样按Ctrl+D结束输入。

   可以用mesg命令关闭或打开用户间的通信
   mesg [ y|n ]

   mail usera 给用户a发送邮件,具体就不多说了。
   系统提示收到邮件,直接输入mail可查看。或者more /var/mail/usera

1.3 常用命令的一些选项

   ls -t 按照时间顺序排列,最后修改的排在前面。
   ls -l long模式,显示所有信息
   ls -rt -r是反转输出顺序,这里即是按时间顺序排列,但是最早修改的排在前面。

$ ls -lrt
total 24
drwxrwxr-x  2 rttw rttw 4096 Dec 17 12:10 downloads
drwxrwxr-x  6 rttw rttw 4096 Dec 17 12:31 source
-rw-------  1 rttw rttw  533 Dec 26 08:15 mbox

   wc统计数字(word-counting),
   wc -l        统计行数

   grep寻找匹配的行,
   grep -v      寻找不匹配的行。

   sort按首字母顺序逐行排序,默认排序依次是空白,大写字母,小写字母。
   sort -r  按正常排序的反序
   sort -n  按数字次序排序
   sort -nr 按逆向数字排序

   tail -n file file文件的最后n行
   tail -f file  动态的显示最后几行。即当有新的信息写入文件,立即显示。
             在查看一些log信息的时候比较有用

   cmp  比较两个文件,找出第一个有区别的地方。
   diff 比较两个文件,包括所有被修改、增加或减少的行。

[ 本帖最后由 tanyear 于 2005-12-30 08:48 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-12-27 00:07 |只看该作者
1.4 shell  wildcard通配符

  常用的*?就不细说了。
  [...][匹配括号内的任何字符
#  rm [12356].txt 删除1.txt, 2.txt, 3.txt, 5.txt, 6.txt文件
#  rm [1-35-6].txt 同上
#  ls  [a-z].txt 列出所有的a.txt, ... , z.txt,等

  书上说通配符只能用于匹配已存在的文件,而不能用来创建文件。
#  mv ch.* chapter.*
   这样是不执行的。

但是在我的系统上
#  ls
1.txt  2.txt  3.txt  4.txt  5.txt  6.txt
# mv *.txt *.tx
mv: when moving multiple files, last argument must be a directory


1.5 I/O重定向(redirection)和管道(pipe)

  I/O重定向指 > , >> , < , <<
  重定向到一个文件时,会判断一个文件是否存在,不存在则创建它,然后再执行命令,写进去。
# ls
1.txt 2.txt
# ls >ls.out
# cat ls.out
1.txt
2.txt
ls.out

由于先判断文件是否存在的关系,ls.out本身也包括在里面了。

类似的情况,在管道中
# ps -ef|grep named
有时候你会grep到“grep named”这个命令。

# set -x
# ps -ef|grep named
+ grep named
+ ps -ef
root      4336  2148  0 18:47 pts/0    00:00:00 grep named

# ps -ef|grep named
+ ps -ef
+ grep named

这是因为管道的程序是“同时”运行的,而不是顺序执行。
管道中的程序是交互式的,由内核对其进行调度和同步处理,以使他们全部运行。

1.6 shell解释的情况

# sort<temp
# sort temp
这两者执行的结果是一样,但实质是有区别的。
sort<temp,是由shell解释<temp,然后作为标准输入传递给sort。
sort temp,是sort把temp看作一个变量,sort读入temp并排序。

#  rm [12356].txt  
同样,这些通配符也都是由shell来解释。而不是这些命令程序
首先shell解释[12356].txt 是1.txt , 2.txt ...
然后rm再读取1.txt , 2.txt ...
因此对于程序来说,通配符,重定向和管道都是透明的。

[ 本帖最后由 tanyear 于 2005-12-29 23:40 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2005-12-27 07:34 |只看该作者
不同的shell对命令的解释有很细微的差别。关于mv的通配符问题。可能提示的错误信息不一样,不过大体上和书上说的并没有冲突。

如果想看一下shell到底是怎么处理的。可以执行
set -x

然后再执行那个mv命令,可以看到shell是怎么展开通配符的。

论坛徽章:
0
4 [报告]
发表于 2005-12-27 22:21 |只看该作者
第2章 文件系统

2.1 od查看文件的字节

   文件就是字节的序列。可用od命令查看文件的字节序列

# cat  tmp                      //cat 显示文件内容
hello
123

# od -c tmp                    //-c 把字节解释为ASCII码字符
0000000   h   e   l   l   o  \n   1   2   3  \n
0000012

# od -cb tmp                 //-b 按八进制显示字节
0000000   h   e   l   l   o  \n   1   2   3  \n
        150 145 154 154 157 012 061 062 063 012
0000012

\n是换行符,在ASCII中,八进制值\n是012
左边的数字表示在文件中的位置。

2.2 文件结束

用换行来结束一行,\n,不对整行做记录或者统计。

而文件的结束没有任何标识。
内核跟踪文件的长度,当一个程序读完文件的所有字节时,就到文件尾结束了。

这个过程是,程序使用系统调用read来取得文件中的数据。
每一次调用read,它都返回文件中的下一部分,同时,还说明返回了文件中多少个字节,
当read说明“返回了零字节”,那么就到了文件尾。

用从终端输入的例子来看看
当从终端读入程序的时候,每次按下enter键,才把每一个输入行传给程序。
使用cat来观察这种情况。
#cat
123enter
123
Ctrl+d
#

然后我们看看Ctrl+d怎么结束文件的

#cat
123Ctrl+d123

Ctrl+d表示“立即把键盘输入的字符传给从终端读取程序”。
当第二次键入Ctrl+d的时候

#cat
123Ctrl+d123Ctrl+d#

shell响应一个提示符。因为cat这次没有读到任何字符。
上面说了,没有读到字符,则意味着文件结束。并且停止。
Ctrl+d 把你键入输出到终端的字符传给程序,
当你什么都没有键入时,程序就没有读入任何字符,就认为到了文件的末尾。
这就是我们键入Ctrl+d,会退出的原因。

2.3 文件结构

首先用file命令来看三种文件格式

# file /bin /bin/ls /root/install.log
/bin:              directory
/bin/ls:           ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), stripped
/root/install.log: ASCII English text

在Unix中,并不像windows靠扩展符,后缀来识别文件类型。
那么file是怎么识别各种不同的文件的呢?
这里用od命令来看看

#od -cb /bin/ls

0000000 177   E   L   F 002 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
        177 105 114 106 002 001 001 000 000 000 000 000 000 000 000 000
0000020 002  \0   >  \0 001  \0  \0  \0   ?  '   @  \0  \0  \0  \0  \0
        002 000 076 000 001 000 000 000 360 047 100 000 000 000 000 000
......                    //省略一小段
*
0000760  \0  \0  \0  \0  \0  \0  \0  \0  \b  \0  \0  \0  \0  \0  \0  \0
        000 000 000 000 000 000 000 000 010 000 000 000 000 000 000 000
0001000   /   l   i   b   6   4   /   l   d   -   l   i   n   u   x   -
        057 154 151 142 066 064 057 154 144 055 154 151 156 165 170 055
0001020   x   8   6   -   6   4   .   s   o   .   2  \0 004  \0  \0  \0
        170 070 066 055 066 064 056 163 157 056 062 000 004 000 000 000
0001040 020  \0  \0  \0 001  \0  \0  \0   G   N   U  \0  \0  \0  \0  \0
        020 000 000 000 001 000 000 000 107 116 125 000 000 000 000 000
0001060 002  \0  \0  \0 004  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0

file通过读入文件的前几百个字节可以查看到文件类型的线索。

[ 本帖最后由 tanyear 于 2005-12-29 14:44 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2005-12-28 12:50 |只看该作者
你把连接地址发这就可以拉

论坛徽章:
0
6 [报告]
发表于 2005-12-28 12:52 |只看该作者
要不就打包把

论坛徽章:
0
7 [报告]
发表于 2005-12-28 14:49 |只看该作者
我没有电子版的啊,呵呵

论坛徽章:
0
8 [报告]
发表于 2005-12-28 14:54 |只看该作者
好教材,楼主继续啊

论坛徽章:
0
9 [报告]
发表于 2005-12-29 14:38 |只看该作者
文件系统这一章不想说太多了。今天把它结束

2.4 关于目录

在某些unix版本上,可以用od查看目录。
因为目录其实也都是文件。
在SunOS 5.9上
在test目录下创建了hello ok两个文件

bash-2.05# ls test
hello  ok

bash-2.05# od -bc test
0000000 000 010 257 320 000 014 000 001 056 000 000 000 000 000 000 002
          \0  \b 257 320  \0  \f  \0 001   .  \0  \0  \0  \0  \0  \0 002
0000020 000 014 000 002 056 056 000 000 000 010 257 322 000 020 000 005
          \0  \f  \0 002   .   .  \0  \0  \0  \b 257 322  \0 020  \0 005
0000040 150 145 154 154 157 000 000 000 000 010 257 323 001 330 000 002
           h   e   l   l   o  \0  \0  \0  \0  \b 257 323 001 330  \0 002
0000060 157 153 000 000 000 000 000 000 000 000 000 000 000 000 000 000
           o   k  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000100 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
          \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0001000

可以看到目录也是一个包含有目录下文件名的一个文件。

但是我在linux下面,centos 4.1是不能查看目录的
# od -bc intel
od: intel: read error: Is a directory
0000000

2.5 目录与文件权限

文件的权限只能由root或者文件的拥有者来改变。
其他人即使有文件的写权限,也不能改变文件的权限

但是这种情况,如果有写的权限,可以把文件copy一份作为你自己的文件
这样你就可以为所欲为了。

-rw-rw-rw-  1 test    test       0 Jan 13 20:21 hehe
比如这样一个文件
[wrxu@lc tmp]$ chmod 644 hehe
chmod: changing permissions of `hehe': Operation not permitted

目录的权限跟文件的权限有些不同,所以这里花一定的篇幅来说明
希望对大家理解目录的权限有帮助。

目录的r权限,表示目录可读,上面有说到目录也是一个包含目录下文件名的文件,
这时候只能够用ls来读此目录。

只有具有x的权限,才能进入到目录,
这里的x并不是可执行,而是搜索的意思。

没有x权限的例子
[snms@matrix root]$ ls -l
drwxrw-rw-  2 root  root       4096 Dec 30 08:59 tmp
[snms@matrix root]$ cd tmp
-bash: cd: tmp: Permission denied
[snms@matrix root]$ ls -l tmp
total 0
?---------  ? ? ? ?           ? a
?---------  ? ? ? ?           ? b
?---------  ? ? ? ?           ? c
虽然snms用户可以读到tmp目录的权限,但是不能搜索到信息。
也不能进去目录。

没有r权限的例子
[snms@matrix root]$ ls -l
drwx-wx-wx  2 root  root       4096 Dec 30 08:59 tmp
[snms@matrix root]$ cd tmp
[snms@matrix tmp]$ ls -l
ls: .: Permission denied
[snms@matrix tmp]$ rm a
rm: remove write-protected regular empty file `a'? n

具有了x权限,所以可以进入目录,具有了w权限,所以可以删除文件
但是没有r权限,读不了目录文件,就无法得到当前目录下的内容。

w权限就是可以创建或删除文件,
注意:删除一个文件的权限与文件本身无关
即使用户对某个目录下的文件没有写的权限,但他只要具有目录的w权限,
就可以轻易的删除此目录下的任何文件。

下面的例子:snms用户删除了root的tmp文件夹下面的写保护文件。
[snms@matrix root]$ ls -l
drwxr-xrwx  2 root  root       4096 Dec 30 08:52 tmp
[snms@matrix root]$ cd tmp
[snms@matrix tmp]$ ls -l
total 12
-rw-r--r--  1 root root 0 Dec 30 08:52 a
-rw-r--r--  1 root root 0 Dec 30 08:52 b
-rw-r--r--  1 root root 0 Dec 30 08:52 c
[snms@matrix tmp]$ rm *
rm: remove write-protected regular empty file `a'?y

所以目录的写权限不要轻易的给出去。

更改权限的命令chmod
chmod [u/g/o]+/-[x/w/r] file
u,g,o分别指user,group,others
+-就是加上或者去掉某种权限

或者chmod 777 file
777这个数的三位,从左到右分别表示用户,组和others
数字的意义,4表示r,2表示w,1表示x
需要什么要的权限把它加起来就可以了。
比如用户读写(r+w),组读(r),others读(r)
                   4+2         4              4
chmod 644 file
数字的记忆办法,都是2的*次方。权限越高,数字越小。

看一个权限的应用。
前面说了用户之间的通信,比如wall,write这类的命令
可以用mesg [ y|n ]来关闭或打开

mesg命令的实质就是对用户当前所在的终端设备的写权限的更改

首先查看test用户的终端设备
test$ who am i
test     pts/1        Dec 29 19:24 (192.168.1.2)

test$ mesg
is y

test$ ls -l /dev/pts/1
crw--w----  1 test tty 136, 1 Dec 29 19:26 /dev/pts/1
test$ mesg n
$ ls -l /dev/pts/1
crw-------  1 test tty 136, 1 Dec 29 19:26 /dev/pts/1

关掉了mesg,关掉了test用户当前所在终端设备的写的权限
这个时候用户tony就不能给test发信息了
tony$ write test
write: test has messages disabled

此时test用户自己都不能写了
test$ write tony
write: you have write permission turned off.

[ 本帖最后由 tanyear 于 2005-12-30 09:37 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2005-12-29 23:33 |只看该作者
2.6 inode与ln

一个文件包括有名称、内容和管理信息如权限或修改时间。
管理信息就存放在Inode中,同时存放的还有文件的长度,文件放在磁盘的位置等

查看一个文件的Inode号码
# ls -i
654076 test1  

我们用ln使一个链指向一个已有的文件。
#ln test1 test2
#ls -i
654076 test1  654076 test2
这里test1和test2的Inode号码是一样的。
也就是说他们其实是同一个文件(Inode号码相同,也即是文件放在磁盘的位置一样),但是具有两个名称。
这样的好处是可以让一个文件存在不同的目录,或者存在不同的名称。
对test1的修改也即是对test2的修改。
# ls -l
-rw-r--r--  2 root root 29 Dec 29 17:32 test1
-rw-r--r--  2 root root 29 Dec 29 17:32 test2
               ~~ 这里的2,就表示指向同一个Inode的链接数。

删掉test2
#ls -l
-rw-r--r--  1 root root 29 Dec 29 17:32 test1

或许会有疑惑,既然test1和test2是同一个文件,为什么删除test2,test1还在呢?
在这种情况,删除test2只是删除了一条指向654076这个Inode的一个链接。
文件依然存在。只有当最后一条链被删除时,即指向Inode的链接数为0时,文件才被删除。

# ln /boot/grub/grub.conf /home/test/grub
ln: creating hard link `grub' to `/boot/grub/grub.conf': Invalid cross-device link

在这里,我的系统分了/,/boot,等分区
ln有一个问题就是不能跨设备(分区或者文件子系统)创建链接,一是因为分区可以被mount和umount,
跨分区的硬链接在分区umount会带来一些麻烦,另外每个分区的Inode值不相同。

昨天看见有个帖说,除了swap区,可以把所有的磁盘分成一个区。
但是这样当一个分区出现文件系统错误,可能所有的数据都没有了。
而划分多个分区,每个分区的Inode不同。即使某个分区的数据错误,也不至于影响到整个系统。

跨设备创建链接,可以使用
#ln -s /test /home/test/test

# ls -li /test
13 -rw-r--r--  1 root root 0 Dec 29 17:45 /test

# ls -li /home/test/test
1697478 lrwxrwxrwx  1 root root 5 Dec 29 17:46 /home/test/test -> /test

这样就是一个软链接,它是可以跨设备的,在文件类型这里会显示l
可以看到它们的Inode号码是不同的,而且链接的数目分别各为1
因此它们并不是同一个文件。

在软链接的情况下,修改链接到的文件/home/test/test,也修改了被链接的文件/test。
但这种方式和硬链接是不同的。这是通过某种机制来实现同步。而不是同一个文件的修改。

删除链接到的文件,对被链接文件没有任何影响。
而删除被链接文件/test,链接到的文件依然存在,但是会闪烁,提示被链接的文件不存在了
也不能读取该文件了
#rm /test
# ls -il /home/test/test
1697478 lrwxrwxrwx  1 root root 5 Dec 29 17:51 /home/test/test -> /test
# more /home/test/test
/home/test/test: No such file or directory

事实上/home/test/test是存在的,作为一种特殊的文件类型为l的文件。
只不过软链接的一些规则决定了它不可读。

为了加深对文件Inode的理解,可以从mv和cp文件来说明:

# cp test1 test2
# ls -i
654076 test1  654081 test2

这两个文件Inode值不一样,cp的实质是复制创建了一个新文件

#mv  test1 test3
#ls -i
654076 test3

跟上面的比较,test1和test3的Inode是相同。
所以mv只是更改了文件的名称,也即是访问文件的入口
它们是指向同一个位置磁盘上的文件。

但是如果mv一个文件到另一个分区。
如前面所讲,不同分区的Inode值是不同的。
# ls -il /root/fs/test
654076 -rw-r--r--  1 root root 29 Dec 29 17:32 /home/fs/test
# mv test /boot/test
# ls -il /boot/test
16 -rw-r--r--  1 root root 29 Dec 29 17:32 /boot/test

所以mv文件到不同的分区,是删除掉原分区的文件之后在另外一个分区重新创建这个文件。
因此有了一个不同的Inode值。

2.7 调整Inode数量
另外,每个分区的Inode数目是有限的。
可以使用df -i来查看

# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/mapper/VolGroup00-LogVol00
                     1958400   97435 1860965    5% /
/dev/sda1              26104      32   26072    1% /boot
/dev/shm               23850       1   23849    1% /dev/shm

当一个磁盘分区(文件子系统)的Inode被用光的时候,是无法再创建文件的。
这种情况在邮件服务器或者BBS这种系统中容易出现,因为用户创建了很多小文件的情况。

要增加Inode的数量只能umount文件系统,然后用mke2fs命令来调整

#mke2fs.ext3 /dev/sda1 [ -N number-of-inodes ]
直接指定需要的Inode数目
或者
#mke2fs.ext3 /dev/sda1 [ -i bytes-per-inode ]
调整字节/inode的比例,来达到增加创建inode数目的目的。
磁盘空间一定的情况下,当然比例越小,能创建的Inode就越多

当然如果你是只有很少但是很大的数据库文件。就可以调高bytes/inode的比例。
(更多的关于mke2fs的信息,自己去man)

不过注意。调整Inode相当于重新格式化了分区。原有的文件都会丢失
所以确实需要调整的话,先要备份数据;
或者在服务器搭建时预先设置好。

[ 本帖最后由 tanyear 于 2005-12-30 07:37 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP