关于文件名的重要规则
1. 以“.” 字符开头的文件名是隐藏文件。这仅表示,ls 命令不能列出它们,用ls-a 命令就可以了。当你创建帐号后,几个配置帐号的隐藏文件被放置在你的家目录下。稍后,我们会仔细研究一些隐藏文件,来定制你的系统环境。另外,一些应用程序也会把它们的配置文件以隐藏文件的形式放在你的家目录下面。
2. 文件名和命令名是大小写敏感的。文件名“File1”和“file1”是指两个不同的文件名。
3. Linux 没有“文件扩展名”的概念,不像其它一些系统。可以用你喜欢的任何名字来给文件起名。文件内容或用途由其它方法来决定。虽然类Unix 的操作系统,不用文件扩展名来决定文件的内容或用途,但是有些应用程序会。
4. 虽然Linux 支持长文件名,文件名可能包含空格,标点符号,但标点符号仅限使用“.”,“-”,下划线。最重要的是,不要在文件名中使用空格。如果你想表示词与词间的空格,用下划线字符来代替。过些时候,你会感激自己这样做。
字符范围
如果你用过别的类Unix 系统的操作环境,或者是读过这方面的书籍,你可能遇到过[A-Z] 或[a-z] 形式的字符范围表示法。这些都是传统的Unix 表示法,并且在
早期的Linux 版本中仍有效。虽然它们仍然起作用,但是你必须小心地使用它们,因为它们不会产生你期望的输出结果,除非你合理地配置它们。从现在开始,你应该避免使用它们,并且用字符类来代替它们。
通配符在GUI 中也有效,通配符非常重要,不仅因为它们经常用在命令行中,而且一些图形文件管理器也支持它们。
• 在Nautilus (GNOME 文件管理器)中,可以通过Edit/Select 模式菜单项来选择文件。输入一个用通配符表示的文件选择模式后,那么当前所浏览的目录中,所匹配的文件名就会高亮显示。
• 在Dolphin 和Konqueror(KDE 文件管理器)中,可以在地址栏中直接输入通配符。例如,如果你想查看目录/usr/bin 中,所有以小写字母‘u’ 开头的文件,在地址栏中敲入‘/usr/bin/u*‘,则文件管理器会显示匹配的结果。
最初源于命令行界面中的想法,在图形界面中也适用。这就是使Linux 桌面系统如此强大的众多原因中的一个。
小心rm!
类Unix 的操作系统,比如说Linux,没有复原命令。一旦你用rm 删除了一些东西,它就消失了。Linux 假定你很聪明,你知道你在做什么。
尤其要小心通配符。思考一下这个经典的例子。假如说,你只想删除一个目录中的HTML 文件。输入:rm *.html
这是正确的,如果你不小心在“*”和“.html”之间多输入了一个空格,就像这样:rm * .html
这个rm 命令会删除目录中的所有文件,还会抱怨没有文件叫做“.html”。小贴士。无论什么时候,rm 命令用到通配符(除了仔细检查输入的内容外!),用ls 命令来测试通配符。这会让你看到要删除的文件列表。然后按下上箭头按键,重新调用刚刚执行的命令,用rm 替换ls。
隐藏文件路径名展开
正如我们知道的,以圆点字符开头的文件名是隐藏文件。路径名展开也尊重这种行为。像这样的展开:echo *
不会显示隐藏文件
要是展开模式以一个圆点开头,我们就能够在展开模式中包含隐藏文件,而且隐藏文件可能会出现在第一位置,就像这样:echo .*
它几乎是起作用了。然而,如果我们仔细检查一下输出结果,我们会看到名字“.” 和“..” 也出现在结果中。因为这些名字是指当前工作目录和它的父目录,使用这种模式可能会产生不正确的结果。我们能看到这样的结果,如果我们试一下这个命令:ls -d .* | less
为了在这种情况下正确地完成路径名展开,我们应该雇佣一个更精确些的模式。这个模式会正确地工作:ls -d .[!.]?*
这种模式展开成为文件名,每个文件名以圆点开头,第二个字符不包含圆点,再包含至少一个字符,并且这个字符之后紧接着任意多个字符。这将列出大多数的隐藏文件(但仍将不能包含以多个圆点开头的文件名)这个带有-A 选项(“几乎所有”)的ls 命令能够提供一份正确的隐藏文件清单:ls -A
反斜杠转义字符序列
反斜杠除了作为转义字符外,反斜杠也是一种表示法的一部分,这种表示法代表某种特殊字符,叫做控制码。ASCII 编码表中前32 个字符被用来把命令转输到像电报机一样的设备。一些编码是众所周知的(制表符,退格符,换行符,和回车符),其它一些编码就不熟悉了(空值,传输结束码,和确认)。
转义序列 含义
\a 响铃(“警告” -导致计算机嘟嘟响)
\b 退格符
\n 新的一行。在类Unix 系统中,产生换行。
\r 回车符
\t 制表符
上表列出了一些常见的反斜杠转义字符。反斜杠表示法背后的思想来源于C 编程语言,许多其它语言也采用了这种表示方法,包括shell。
echo 命令带上‘-e’ 选项,能够解释转义序列。你可以把转义序列放在$’ ’ 里面。以下例子,使用sleep 命令,一个简单的程序,它会等待指定的秒数,然后退出。
我们可以创建一个简单的倒数计数器:
sleep 10; echo -e ”Time’s up\a”
我们也可以这样做:
sleep 10; echo ”Time’s up” $’\a’
什么是“文本”
在计算机中,有许多方法可以表达信息。所有的方法都涉及到,在信息与一些数字之间确立一种关系,而这些数字可以用来代表信息。毕竟,计算机只能理解数字,这样所有的数据都被转换成数值来表示。有些数值表达法非常复杂(例如压缩的视频文件),而其它的就相当简单。最早也是最简单的一种表达法,叫做ASCII 文本。ASCII(发音是“As-Key”)是美国信息交换标准码的简称。这是一个简单的编码方法,它首先被用在电传打字机上,用来实现键盘字符到数字的映射。文本是简单的字符与数字之间的一对一映射。它非常紧凑。五十个字符的文本翻译成五十个字节的数据。文本只是包含简单的字符到数字的映射,理解这点很重要。它和一些文字处理器文档不一样,比如说由微OpenOffice.org 文档编辑器创建的文件。这些文件,和简单的ASCII 文件形成鲜明对比,它们包含许多非文本元素,来描述它的结构和格式。普通的ASCII 文件,只包含字符本身,和一些基本的控制符,像制表符,回车符及换行符。纵观Linux 系统,许多文件以文本格式存储,也有许多Linux 工具来处理文本文件。甚至Windows 也承认这种文件格式的重要性。著名的NOTEPAD.EXE 程序就是一个ASCII 文本文件编辑器。
元键
如果你冒险进入到Readline 的文档中,你会在bash 手册页的READLINE 段落,遇到一个术语“元键”(meta key)。在当今的键盘上,这个元键是指Alt 键,但并不总是这样。
回到昏暗的年代(在PC 之前Unix 之后),并不是每个人都有他们自己的计算机。他们可能有一个叫做终端的设备。一个终端是一种通信设备,它以一个文本显示屏幕和一个键盘作为其特色,它里面有足够的电子器件来显示文本字符和移动光标。它连接到(通常通过串行电缆)一个更大的计算机或者是一个大型计算机的通信网络。有许多不同的终端产品商标,它们有着不同的键盘和特征显示集。因为它们都倾向于至少能理解ASCII,所以软件开发者想要符合最低标准的可移植的应用程序。Unix 系统有一个非常精巧的方法来处理各种终端产品和它们不同的显示特征。因为Readline 程序的开发者们,不能确定一个专用多余的控制键的存在,他们发明了一个控制键,并把它叫做“元”(”meta”)。然而在现代的键盘上,Alt 键作为元键来服务。如果你仍然在使用终端(在Linux 中,你仍然可以得到一个终端),你也可以按下和释放Esc 键来得到如控制Alt 键一样的效果。
可编程自动补全
目前的bash 版本有一个叫做可编程自动补全工具。可编程自动补全允许你(更可能是,你的发行版提供商)来加入额外的自动补全规则。通常需要加入对特定应用程序的支持,来完成这个任务。例如,有可能为一个命令的选项列表,或者一个应用程序支持的特殊文件类型加入自动补全。默认情况下,Ubuntu 已经定义了一个相当大的规则集合。可编程自动补全是由shell 函数实现的,shell 函数是一种小巧的shell 脚本,我们会在后面的章节中讨论到。如果你感到好奇,试一下:set | less查看一下如果你能找到它们的话。默认情况下,并不是所有的发行版都包括它们。
脚本
除了bash 中的命令历史特性,许多Linux 发行版包括一个叫做script 的程序,这个程序可以记录整个shell 会话,并把shell 会话存在一个文件里面。这个命令的基本语法是:
script [file]
命令中的file 是指用来存储shell 会话记录的文件名。如果没有指定文件名,则使用文件typescript。查看脚本的手册页,可以得到一个关于script 程序选项和特点的完整列表。
究竟什么是八进制?
八进制(以8 为基数),和她的亲戚,十六进制(以16 为基数)都是数字系统,通常被用来表示计算机中的数字。我们人类,因为这个事实(或者至少大多数人)天生具有十个手指,利用以10 为基数的数字系统来计数。计算机,从另一方面讲,生来只有一个手指,因此它以二进制(以2 为基数)来计数。它们的数字系统只有两个数值,0 和1。因此在二进制中,计数看起来像这样:
0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011. . .
在八进制中,逢八进一,用数字0 到7 来计数,像这样:
0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21. . .
十六进制中,使用数字0 到9,加上大写字母“A” 到”F” 来计数,逢16 进一:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13. . .
虽然我们能知道二进制的意义(因为计算机只有一个手指),但是八进制和十六进制对什么好处呢?答案是为了人类的便利。许多时候,在计算机中,一小部分数据以二进制的形式表示。以RGB 颜色为例来说明。大多数的计算机显示器,每个像素由三种颜色组成:8 位红色,8 位绿色,8 位蓝色。这样,一种可爱的中蓝色就由24 位数字来表示:
010000110110111111001101
我不认为你每天都喜欢读写这类数字。另一种数字系统对我们更有帮助。每个十六进制数字代表四个二进制。在八进制中,每个数字代表三个二进制数字。那么代表中蓝色的24 位二进制能够压缩成6 位十六进制数:436FCD
因为十六进制中的两个数字对应二进制的8 位数字,我们可以看到”43“代表红色,“6F”代表绿色,“CD”代表蓝色。
现在,十六进制表示法(经常叫做“hex”)比八进制更普遍,但是我们很快会看到,用八进制来表示3 个二进制数非常有用处. . .
一些特殊权限
虽然我们通常看到一个八进制的权限掩码用三位数字来表示,但是从技术层面上来讲,用四位数字来表示它更确切些。为什么呢?因为,除了读取,写入,和执行权限之外,还有其它的,较少用到的权限设置。其中之一是setuid 位(八进制4000)。当应用到一个可执行文件时,它把有效用户ID 从真正的用户(实际运行程序的用户)设置成程序所有者的ID。这种操作通常会应用到一些由超级用户所拥有的程序。当一个普通用户运行一个程序,这个程序由根用户(root) 所有,并且设置了setuid 位,这个程序运行时具有超级用户的特权,这样程序就可以访问普通用户禁止访问的文件和目录。很明显,因为这会引起安全方面的问题,所有可以设置setuid 位的程序个数,必须控制在绝对小的范围
内。
第二个是setgid 位(八进制2000),这个相似于setuid 位,把有效用户组ID 从真正的用户组ID 更改为文件所有者的组ID。如果设置了一个目录的setgid 位,则目录中新创建的文件具有这个目录用户组的所有权,而不是文件创建者所属用户组的所有权。对于共享目录来说,当一个普通用户组中的成员,需要访问共享目录中的所有文件,而不管文件所有者的主用户组时,那么设置setgid 位很有用处。
第三个是sticky 位(八进制1000)。这个继承于Unix,在Unix 中,它可能把一个可执行文件标志为“不可交换的”。在Linux 中,会忽略文件的sticky 位,但是如果一个目录设置了sticky 位,那么它能阻止用户删除或重命名文件,除非用户是这个目录的所有者,或者是文件所有者,或是超级用户。这个经常用来控制访问共享目录,比方说/tmp。这里有一些例子,使用chmod 命令和符号表示法,来设置这些特殊的权限。首先,授予一个程序setuid 权限。
chmod u+s program
下一步,授予一个目录setgid 权限:
chmod g+s dir
最后,授予一个目录sticky 权限:
chmod +t dir
当浏览ls 命令的输出结果时,你可以确认这些特殊权限。这里有一些例子。首先,一个程序被设置为setuid 属性:
-rwsr-xr-x
具有setgid 属性的目录:
drwxrwsr-x
设置了sticky 位的目录:
drwxrwxrwt
Ubuntu 与sudo
普通用户经常会遇到这样的问题,怎样完成某些需要超级用户权限的任务。这些任务包括安装和更新软件,编辑系统配置文件,和访问设备。在Windows 世界里,这些任务是通过授予用户管理员权限来完成的。这允许用户执行这些任务。然而,这也会导致用户所执行的程序拥有同样的能力。在大多数情况下,这是我们所期望的,但是它也允许malware (恶意软件),比方说电脑病毒,自由地支配计算机。
在Unix 世界中,由于Unix 是多用户系统,所以在普通用户和管理员之间总是存在很大的差别。Unix 采取的方法是只有在需要的时候,才授予普通用户超级用户权限。这样,普遍会用到su 和sudo 命令。
几年前,大多数的Linux 发行版都依赖于su 命令,来达到目的。su 命令不需要sudo 命令所要求的配置,su 命令拥有一个root 帐号,是Unix 中的传统。但这会引起问题。所有用户会企图以root 用户帐号来操纵系统。事实上,一些用户专门以root 用户帐号来操作系统,因为这样做,的确消除了所有那些讨厌的“权限被拒绝”的消息。相比于Windows 系统安全性而言,这样做,你就削弱了Linux 系统安全性能。不是一个好主意。
当引进Ubuntu 的时候,它的创作者们采取了不同的策略。默认情况下,Ubuntu不允许用户登录到root 帐号(因为不能为root 帐号设置密码),而是使用sudo 命令授予普通用户超级用户权限。通过sudo 命令,最初的用户可以拥有超级用户权限,也可以授予随后的用户帐号相似的权力。
SSH 通道
当你通过SSH 协议与远端主机建立连接的时候,其中发生的事就是在本地与远端系统之间创建了一条加密通道。通常,这条通道被用来把在本地系统中输入的命令安全地传输到远端系统,同样地,再把执行结果安全地发送回来。除了这个基本功能之外,SSH 协议允许大多数网络流量类型通过这条加密通道来被传送,在本地与远端系统之间创建某种VPN(虚拟专用网络)。可能这个特性的最普遍使用是允许传递X 窗口系统流量。在运行着X 服务器(也就是,能显示GUI 的机器)的系统中,有可能在远端启动和运行一个X 客户端程序(一个图形化应用程序),而应用程序的显示结果出现在本地。这很容易完成,这里有个例子:假设我们正坐在一台装有Linux 系统,叫做linuxbox 的机器之前,,且系统中运行着X 服务器,现在我们想要在名为remote-sys 的远端系统中运行xload 程序,但是要在我们的本地系统中看到这个程序的图形化输出。我们可以这样做:
[me@linuxbox ~]$ ssh -X remote-sys
me@remote-sys's password:
Last login: Mon Sep 08 13:23:11 2008
[me@remote-sys ~]$ xload
这个xload 命令在远端执行之后,它的窗口就会出现在本地。在某些系统中,你可能需要使用“- Y”选项,而不是“- X”选项来完成这个操作。
处理古怪的文件名
类Unix 的系统允许在文件名中嵌入空格(甚至换行符)。这就给一些程序,如为其它程序构建参数列表的xargs 程序,造成了问题。一个嵌入的空格会被看作是一个界定符,生成的命令会把每个空格分离的单词解释为单独的参数。为了解决这个问题,find 命令和xarg 程序允许可选择的使用一个null 字符作为参数分隔符。一个null 字符被定义在ASCII 码中,由数字零来表示(相反的,例如,空格字符在ASCII 码中由数字32 表示)。find 命令提供的-print0 行为,则会产生由null 字符分离的输出,并且xargs 命令有一个–null 选项,这个选项会接受由null 字符分离的输入。这里有一个例子:
find -iname ‘*.jpg’ -print0 | xargs –null ls -l
使用这项技术,我们可以保证所有文件,甚至那些文件名中包含空格的文件,都能被正确地处理