命令 (command) :在 Unix 中,命令是一个可以运行的程序。要在 Unix 中运行一条命令,则要输入它的名字并按 Enter 。
命令分隔符:分号 (;) 被看作是一个命令分隔符,它指出一条命令的结束和另一条的开始。如果不使用分号分隔复合命令中的各一条命令,计算机就不能识别出一条命令结束或下一条命令开始在何处。
Shell 提供一个到 Unix 系统的接口,它收集用户的输入并根据输入来执行程序。当一个程序执行结束后,它显示程序的输出。由于这个原因, Shell 经常被看作是 Unix 系统的命令解释器。 Shell 还是一个强大的编程语言,有着完整的条件语句、循环和函数。
交互和非交互 Shell :
若 Shell 显示一个提示符,则说明它正运行在交互模式下。所谓交互模式 (interactive mode) 意为 Shell 获取用户的输入并执行声明的命令。该模式被称为交互式是因为 Shell 与用户进行交互。它是多数用户熟悉的 Shell 常用模式:登录进入、执行一些命令、退出登录。当使用 exit 命令退出时, Shell 也退出。
非交互模式 (noninteractive mode) : Shell 不与用户交互而是读入保存在一个文件中的命令并执行它们,当到达文件结尾时, Shell 退出。
当 login 程序启动一个 Shell 时,它执行下面命令: /bin/sh
执行该命令后, Shell 被置为交互模式。用户可以在提示符后执行同一命令来启动另一个 Shell 并置为交互模式:
$/bin/sh
$
第一个 $ 是由 login 启动的 Shell 显示的,第二个 $ 是由用户启动的 Shell 显示的。可使用 exit 命令从当前 Shell 退出 :
$exit
$
现在显示的提示符是 login 启动的 Shell 显示的,在提示符后再输入 exit 就可退出登录。
可以像下面这样非交互地启动 Shell :
$/bin/sh filename
这里 filename 是包含要执行命令的文件名,例如复合命令 : $ date; who
把这些命令输入一个叫 logins 的文件中。首先在编辑器中打开一个名为 logins 的文件并输入上面的命令。假设文件位于当前目录下,当文件保存后,可以如下运行命令:
$/bin/sh logins
这就执行了复合命令并显示输出。
一个 Shell 脚本是保存在一个文件中的命令列表, Shell 可非交互式地执行它。
使 Shell 脚本可执行:
写 Shell 脚本的一个重要任务是使 Shell 脚本可执行,且要保证脚本中调用的 Shell 是正确的。
在前面的例子中,创建的 logins 脚本执行以下复合命令:
date; who;
如果要通过输入名字来运行脚本,则需要做两件事:
1. 使它可执行。
2. 确保脚本运行时使用正确的 Shell 。
要使脚本可执行,需做以下事情:
chmod a+x ./logins
要确保使用正确的 shell 来运行脚本,则要在脚本开头增加如下一行代码:
#!/bin/sh
于是脚本就有了两行:
#!/bin/sh
date;who;
开头一行调用一个新 Shell( 本例中为 /bin/sh) 来执行脚本。没有这一行,不论脚本是为哪种 Shell 写的,总使用当前 Shell 来执行脚本。
#!/bin/sh 的魔力:
#!/bin/sh 必须位于 Shell 脚本的第一行,以使用 sh 来运行脚本。如果在其他任何行中出现,所有 Shell 都会认为这是注释而将其忽略掉。
内核 (kernel) : 是 Unix 系统的心脏,它给工具提供访问机器硬件的一种方式。它还处理命令的调度和执行。
未初始化 Shell(Uninitialized Shell) : 当 Shell 刚启动时,它还没有被初始化。这意味着 Shell 正确运行所需要的重要参数未被定义。
Shell 初始化 (Shell Initialization) : 当 Shell 启动后,它要经历一个叫做初始化的阶段来设置一些重要的参数。这实际是一个两步的过程, Shell 在此时读取文件 /etc/profile 和 .profile 。
交互模式 (Interactive) :在交互模式下, Shell 读取用户输入并执行声明的命令。该模式被称作交互式是因为 Shell 用户进行交互。
非交互模式 (Noninteractive): 在非交互模式下, Shell 不与用户交互,而是读取存储在文件中的命令并执行它们。当到达文件尾时, Shell 退出。
Shell 脚本 (Shell Script) :一个 Shell 脚本是 Shell 非交互执行的一组保存在文件中的命令。
第三学时:
在 Unix 系统中有三种基本类型的文件:普通文件,目录,特殊文件。
普通文件:系统中包含数据、文本或程序指令的文件。
目录:用来保存特殊和普通文件。
特殊文件:提供对硬件如硬盘驱动器、 CD-ROM 驱动器,调制解调器和网络适配器等的访问。
不可见文件:是名字第一个字符为点或句点 (.) 的文件。 Unix 程序 ( 包含 Shell) 大多使用这些文件来存储配置信息。
隐藏文件包括:
.profile, Bourne Shell(sh) 的初始化脚本。
.kshrc, Korn Shell(ksh) 的初始化脚本。
.cshrc, C Shell (csh) 的初始化标本。
.rhosts, 远程 Shell 配置文件。
所有不以 ”.” 符号开始的文件都被认为是可见的。要列出不可见文件,就要在 ls 后面声明 -a 选项: $ls –a
目录 ”.” 表示当前目录,目录 ”..” 表示父目录
命令:
第四学时 目录操作
Unix 使用层次结构来组织文件和目录,这种结构常被称为目录树 (directory tree) 。该树只有一个根结点,即斜杠 (/), 所有其他目录都包含在它的下面。
含 ”/” 的目录,可用来存储文件和其他目录。每个文件都在一个目录里,而除 ”/” 之外的每个目录都位于另一个目录之下。这与 Windows 和 Max OS 使用的多根层次结构有些不同,在那些操作系统中,所有的设备 ( 如软盘驱动器、 CD-ROM 、硬盘等 ) 都位于最高的目录层。目录树的深度是受限制的,文件的绝对路径不能超过 1024 个字符。
避免使用空格作为文件名。 Unix 大小写敏感!
绝对 (absolute) 路径名 :从根目录开始,列出了改文件或目录与根目录之间所有的目录。由于绝对路径名列出了从根目录开始的路径,所以它总是以 / 开始的。无论当前目录是什么,绝对路径都指向一个文件或目录的确切位置。
相对 (relative) 路径名:使用户能通过相对当前目录的文件名或路径名来访问文件或目录。当前目录改变时,文件的相对路径名也发生变化。
命令 pwd(print working directory), 打印出用户当前所位于的目录名。
当生命一个相对路径名时, ”/” 不在路径名的开头出现,这表示使用的是相对路径名而不是绝对路径名。相对路径名包含当前目录和要找的文件或目录之间的目录。 Unix 文件系统使用两个点 (..) 代表树种更高一层的目录,用一个点 (.) 代表当前目录。
例如:假设当前目录为: /home/ranga/work
则相对路径名: ../docs/ch5.doc
代表文件 : /home/ranga/docs/ch5.doc
而 .docs/ch5.doc
代表文件: /home/ranga/work/docs/ch5.doc
用户可以使用下面相对路径指向该文件:
docs/ch5.doc
正如前面提到的,不需要在路径名前加 ./ 来表示文件或目录位于当前目录下或它的一个子目录下。
判断用户起始目录位置最简单的方法如下:
$cd
$pwd
当不带参数执行 cd 命令时,它把当前目录改变到起始目录中。这样,在 cd 命令完成后, pwd 命令打印出的工作目录是用户的起始目录。
创建目录: mkdir
拷贝目录: cp –r source destination
移动文件和目录: mv source destination, 也可重命名文件。当用户移动多个文件时,不能对它们进行重命名。如果想重命名并移动文件,则必须对它单独使用一个 mv 命令。
删除目录: rmdir( 删除空目录 ) or rm –r( 该命令无法恢复,删除目录和它里面的内容 )
第五学时 文件属性操作
字符 |
文件类型 |
l |
符号链 |
c |
字符特殊文件 |
b |
块特殊文件 |
p |
命名管道 |
s |
Socket |
- |
普通文件 |
d |
目录文件 |
1. 普通文件: 是最常遇到的文件类型。普通文件存储任何类型的数据,这些数据可以是纯文本、应用程序特定格式或系统可执行的特定二进制格式。 Unix 系统不需要理解普通文件包含的数据。普通文件可以存储任何形式的原始数据,因为 Unix 不解释文件中的数据。
file 命令可是显示某文件是一个二进制程序、 Shell 脚本还是一个库。
2. 符号链: 指向系统中另一个文件的特殊文件。当访问其中一个文件可看到在文件中存着一个路径名。使用该路径名可以到达该符号链代表的系统中的一个文件或目录。符号链类似于 Windows 系统中的快捷方式或别名。用户可以用符号链使一个文件好像在文件系统中位于许多不同的地方或有许多不同的名字。符号链可以指向任何类型的文件或目录。例子:符号链的 ls –l 输出像下面这样:
lrwxrwxrwx 1 root root 9 Oct. 23 13:58 /bin/-> ./usr/bin/ 输出显示目录 /bin 实际是一个到目录 ./usr/bin 的链接。输出中的相对路径不是相对于用户的当前工作目录,它是相对于符号链所在的目录。在本例中,链 /bin 位于 / 目录下,这样 ./usr/bin 指 /bin 是一个到目录 /usr/bin 的链接。 (1). 创建符号链,命令: ln –s source destination; 这里 source 是原文件的相对路径或绝对路径 , destination 是链的名字。
3. 设备文件: 用户可以通过读写设备文件来访问 Unix 设备,这些设备文件是设备在文件系统内的访问点。设备文件通常位于 /dev 目录下,两种主要的设备文件是: (a) 字符特殊文件; (b) 块特殊文件
字符特殊 (character special) 文件 提供每次一个字符与设备通信的机制。通常,字符设备代表一个 ” 原始 ” 设备。块特殊 (block special) 文件 提供通过文件系统与设备驱动程序通信的机制。这些文件被称作块设备 (block device), 块设备每次传输一个大的数据块,这种文件类型的典型代表是硬盘和可移动媒质。
4. 命名管道: Unix 的一个伟大特征是用户可以花费很少的代价而把一个程序的输出重定向为另一个程序的输入。例如,命令 who | grep ranga 使 who 命令的输出成为 grep 命令的输入。这叫把一个命令的输出用管道传送 (piping) 到另一个命令中。
文件基本权限:
字母 |
权限 |
定义 |
r |
读 |
用户可以浏览文件的内容 |
w |
写 |
用户可以改变文件的内容 |
x |
执行 |
用户可以像运行程序一样运行文件。对于目录必须要设执行权限才能使用户进入目录。 |
用 ls –l 命令显示文件拥有的权限。例如: $ls –l /home/ranga/.profile
-rwx r-x r-x 1 ranga users 2368 Jul. 11 15:57 .profile*
解释:因为第一个字符时连接符 (-), 所以该文件是一个普通文件。在连接符后有几个字符。前三个字符显示文件所有者的权限 ,下面三个字符显示文件相关分组的权限 ,最后三个字符显示所有其他用户的权限, 权限之后列出了所有者和组。
该文件的权限部分显示拥有者有读写和执行的权限,而分组成员用户和其他所有的用户只有读和执行权限。
1. 目录权限:
目录的 x 位授予对目录的访问权。访问位没有设置并不影响读和写权限。
目录的读权限可以使用户查看目录中的文件及其属性。
目录的写权限使用户能在目录中增添或删除文件。
若用户只被授予目录的执行权限,则不能查看目录中的文件或从目录中增加、删除文件,但用户可以运行目录中的可执行文件。
2. 改变文件和目录权限:
用户可以使用 chmod 命令改变文件和目录权限,基本语法为: chmod expression files.
这里的 expression 是一条怎样改变权限的语句。该表达式可以是下面类型: (a) 符号, (b) 八进制。
符号表达方式使用字母来改变权限,而八进制表达方式使用数字来改变权限。八进制方式中的数字是范围从 0~7 的八进制数。
(a) :符号方式: 符号表达式的语法为: (who)(actions)(permissions) ,它们的取值分别如下三个表格:
Who 表:
字母 |
代表含义 |
u |
所有者 |
g |
组 |
o |
其他 |
a |
所有 |
Actions 表:
符号 |
代表含义 |
+ |
为文件增加权限 |
- |
为文件删除权限 |
= |
显式地设置文件权限 |
Permissions 表:
字母 |
代表含义 |
r |
读 |
w |
写 |
x |
执行 |
s |
SUID 或 SGID |
例子:要把一个目录中所有文件的读访问权限赋给其他所有用户,可以使用以下命令之一: $chmod a=r* or $chmod guo=r*
要防止文件 .profile 的所有者之外的任何用户写该文件,可以使用 $ chmod go-w .profile
要防止对用户起始目录下文件的访问,可以使用命令 :$cd;chmod go=* or $cd;chmod go-rwx*
当指定用户部分或权限部分时,给出的字母顺序是无关紧要的,因此下面命令是等价的: $chmod guo+rx* $chmod uog+xr*
如果用户要为一个或多个文件改变不止一组权限,可以使用逗号分隔,例如: $chmod go-w,a+x a.out
把组和其他所有用户对 a.out 文件的写权限删除并为每个人增加了执行权限,要为起始目录设置 SUID 和 SGID 位,可以使用命令:
$ch;chmod ug+s
(b) 八进制方式: 用八进制表达式改变权限只能显式地设置文件权限。详见 man
3. 改变所有者和组: chown “change owner 改变文件的所有者 ”; chgrp “change group 改变文件的组 ” 。为了最大程度地实现可移植性,用户应该坚持使用 chown 来改变一个文件的所有者和组。