The Linux Command Line
说到命令行,我们真正指的是 shell。shell 就是一个程序,它接受从键盘输入的命令, 然后把命令传递给操作系统去执行。几乎所有的 Linux 发行版都提供一个名为 bash 的 来自 GNU 项目的 shell 程序。“bash” 是 “Bourne Again SHell” (作者叫做Bourne,双关born again shell)的首字母缩写。
使用图形用户界面时,我们需要另一个和 shell 交互的叫做终端仿真器的程序。它允许我们访问shell。
当我们打开终端时,首先会出现一行shell提示符,通常包括你的用户名@主机名,紧接着当前工作目录和一个美元符号。如果提示符的最后一个字符是“#”, 而不是“$”, 那么这个终端会话就有超级用户权限。
命令行上手
date 显示系统当前时间和日期。
cal 显示当前月份的日历。
df 查看磁盘剩余空间。
free 显示空闲内存的数量。
exit 退出终端
幕后控制台
即使终端仿真器没有运行,在后台仍然有几个终端会话运行着。这些终端会话可以通过按下 Ctrl-Alt-F1 到 Ctrl-Alt-F6 访问。当一个会话被访问的时候, 它会显示登录提示框,我们需要输入用户名和密码。要从一个虚拟控制台转换到另一个, 按下 Alt 和 F1-F6(中的一个)。返回图形桌面,按下 Alt-F7。(当然,如果你的键盘通过Fn键控制F1-F12,你同时还需要按下Fn)。
文件系统跳转
pwd 打印当前目录
cd 改变目录
ls 列出目录内容
绝对路径从根目录开始,直到它的目的地,而相对路径开始于工作目录。 为了做到这个(用相对路径表示), 我们在文件系统树中用一对特殊符号来表示相对位置。 这对特殊符号是 “.” (点) 和 “..” (点点)。符号 “.” 指的是工作目录,”..” 指的是工作目录的父目录。
快捷键 | 运行结果 |
---|---|
cd | 更改工作目录到你的家目录。 |
cd - | 更改工作目录到先前的工作目录。 |
cd ~user_name | 更改工作目录到用户家目录。例如, cd ~bob 会更改工作目录到用户“bob”的家目录。 |
关于文件名的重要规则
-
以 “.” 字符开头的文件名是隐藏文件。这表示,ls 命令不能列出它们, 用 ls -a 命令就可以了。
-
文件名和命令名是大小写敏感的。文件名 “File1” 和 “file1” 是指两个不同的文件名。
-
Linux 没有“文件扩展名”的概念,可以用你喜欢的任何名字来给文件起名。文件内容或用途由其它方法来决定。虽然类 Unix 的操作系统,不用文件扩展名来决定文件的内容或用途,但是有些应用程序会。
-
虽然 Linux 支持长文件名,文件名可能包含空格,标点符号,但标点符号仅限 使用 “.”,“-”,下划线。需要注意的是,最好不要在文件名中使用空格。如果你想表示词与词间的空格,用下划线字符来代替。
选项和参数
命令名经常会带有一个或多个用来更正命令行为的选项, 更进一步,选项后面会带有一个或多个参数,这些参数是命令作用的对象。一般形式为:
command -options arguments
大多数命令使用的选项,是由一个中划线加上一个字符组成,例如,“-l”,但是许多命令,也支持长选项,长选项由两个中划线加上一个字组成,如“--reverse”。同时,许多命令也允许把多个短选项串在一起使用,如“-lt”。
选项 | 长选项 | 描述 |
---|---|---|
-a | --all | 列出所有文件,甚至包括文件名以圆点开头的默认会被隐藏的隐藏文件。 |
-d | --directory | 通常,如果指定了目录名,ls 命令会列出这个目录中的内容,而不是目录本身。 把这个选项与 -l 选项结合使用,可以看到所指定目录的详细信息,而不是目录中的内容。 |
-F | --classify | 这个选项会在每个所列出的名字后面加上一个指示符。例如,如果名字是 目录名,则会加上一个'/'字符。 |
-h | --human-readable | 当以长格式列出时,以人们可读的格式,而不是以字节数来显示文件的大小。 |
-l | 以长格式显示结果。 | |
-r | --reverse | 以相反的顺序来显示结果。通常,ls 命令的输出结果按照字母升序排列。 |
-S | 命令输出结果按照文件大小来排序。 | |
-t | 按照修改时间来排序。 |
字段 | 含义 |
---|---|
-rw-r--r-- | 对于文件的访问权限。第一个字符指明文件类型。在不同类型之间, 开头的“-”说明是一个普通文件,“d”表明是一个目录。其后三个字符是文件所有者的 访问权限,再其后的三个字符是文件所属组中成员的访问权限,最后三个字符是其他所有人的访问权限。 |
1 | 文件的硬链接数目。 |
root | 文件所有者的用户名。 |
root | 文件所属用户组的名字。 |
32059 | 以字节数表示的文件大小。 |
2007-04-03 11:05 | 上次修改文件的时间和日期。 |
oo-cd-cover.odf | 文件名。 |
确定文件类型
调用 file 命令,会打印出文件内容的简单描述。
file filename
用 less 浏览文件内容
less filename
命令 | 行为 |
---|---|
Page UP or b | 向上翻滚一页 |
Page Down or space | 向下翻滚一页 |
UP Arrow | 向上翻滚一行 |
Down Arrow | 向下翻滚一行 |
G | 移动到最后一行 |
1G or g | 移动到开头一行 |
/charaters | 向前查找指定的字符串 |
n | 向前查找下一个出现的字符串,这个字符串是之前所指定查找的 |
h | 显示帮助屏幕 |
q | 退出 less 程序 |
复制粘贴小技巧:可以通过鼠标双击来复制字符串、文件名和命令名等,也可以通过鼠标三击来复制整段文本,然后点击鼠标右键完成粘贴。
操作系统探究
目录 | 评论 |
---|---|
/ | 根目录。 |
/bin | 包含系统启动和运行所必须的二进制程序。 |
/boot | 包含 Linux 内核、初始 RAM 磁盘映像(用于启动时所需的驱动)和 启动加载程序。 有趣的文件:
|
/dev | 这是一个包含设备结点的特殊目录。“一切都是文件”,也适用于设备。 在这个目录里,内核维护着所有设备的列表。 |
/etc | 这个目录包含所有系统层面的配置文件。它也包含一系列的 shell 脚本, 在系统启动时,这些脚本会开启每个系统服务。这个目录中的任何文件应该是可读的文本文件。 有趣的文件:虽然/etc 目录中的任何文件都有趣,但这里只列出了一些我一直喜欢的文件:
|
/home | 在通常的配置环境下,系统会在/home 下,给每个用户分配一个目录。普通用户只能 在自己的目录下写文件。这个限制保护系统免受错误的用户活动破坏。 |
/lib | 包含核心系统程序所使用的共享库文件。这些文件与 Windows 中的动态链接库相似。 |
/lost+found | 每个使用 Linux 文件系统的格式化分区或设备,例如 ext3文件系统, 都会有这个目录。当部分恢复一个损坏的文件系统时,会用到这个目录。这个目录应该是空的,除非文件系统 真正的损坏了。 |
/media | 在现在的 Linux 系统中,/media 目录会包含可移动介质的挂载点, 例如 USB 驱动器,CD-ROMs 等等。这些介质连接到计算机之后,会自动地挂载到这个目录结点下。 |
/mnt | 在早些的 Linux 系统中,/mnt 目录包含可移动介质的挂载点。 |
/opt | 这个/opt 目录被用来安装“可选的”软件。这个主要用来存储可能 安装在系统中的商业软件产品。 |
/proc | 这个/proc 目录很特殊。从存储在硬盘上的文件的意义上说,它不是真正的文件系统。 相反,它是一个由 Linux 内核维护的虚拟文件系统。它所包含的文件是内核的窥视孔。这些文件是可读的, 它们会告诉你内核是怎样监管计算机的。 |
/root | root 帐户的家目录。 |
/sbin | 这个目录包含“系统”二进制文件。它们是完成重大系统任务的程序,通常为超级用户保留。 |
/tmp | 这个/tmp 目录,是用来存储由各种程序创建的临时文件的地方。一些配置导致系统每次 重新启动时,都会清空这个目录。 |
/usr | 在 Linux 系统中,/usr 目录可能是最大的一个。它包含普通用户所需要的所有程序和文件。 |
/usr/bin | /usr/bin 目录包含系统安装的可执行程序。通常,这个目录会包含许多程序。 |
/usr/lib | 包含由/usr/bin 目录中的程序所用的共享库。 |
/usr/local | 这个/usr/local 目录,是非系统发行版自带程序的安装目录。 通常,由源码编译的程序会安装在/usr/local/bin 目录下。新安装的 Linux 系统中会存在这个目录, 并且在管理员安装程序之前,这个目录是空的。 |
/usr/sbin | 包含许多系统管理程序。 |
/usr/share | /usr/share 目录包含许多由/usr/bin 目录中的程序使用的共享数据。 其中包括像默认的配置文件、图标、桌面背景、音频文件等等。 |
/usr/share/doc | 大多数安装在系统中的软件包会包含一些文档。在/usr/share/doc 目录下, 我们可以找到按照软件包分类的文档。 |
/var | 除了/tmp 和/home 目录之外,相对来说,目前我们看到的目录是静态的,这是说, 它们的内容不会改变。/var 目录存放的是动态文件。各种数据库,假脱机文件, 用户邮件等等,都位于在这里。 |
/var/log | 这个/var/log 目录包含日志文件、各种系统活动的记录。这些文件非常重要,并且 应该时时监测它们。其中最重要的一个文件是/var/log/messages。注意,为了系统安全,在一些系统中, 你必须是超级用户才能查看这些日志文件。 |
硬链接
类似于c++中引用的概念,即给一个文件设置多个名字。每个文件默认会有一个硬链接, 这个硬链接给予文件名字。我们每创建一个硬链接,就为一个文件创建了一个额外的目录项。只是这些目录项指向的是同一个内存段。
A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点(文件索引节点)号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指向同一个文件,A和B对文件系统来说是完全平等的。如果删除了其中一个,对另外一个没有影响。每增加一个文件名,inode节点上的链接数增加一,每删除一个对应的文件名,inode节点上的链接数减一,直到为0,inode节点和对应的数据块被回收。注:文件和文件名是不同的东西,rm A删除的只是A这个文件名,而A对应的数据块(文件)只有在inode节点链接数减少为0的时候才会被系统回收。
ls 命令有一种方法,来展示(文件索引节点)的信息。在命令中加上”-i”选项:
ls -li
第一字段表示文件索引节点号。
硬链接有两个重要局限性:
-
一个硬链接不能关联它所在文件系统之外的文件。这是说一个链接不能关联与链接本身不在同一个磁盘分区上的文件。
-
一个硬链接不能关联一个目录。
一个硬链接和文件本身没有什么区别。当你列出一个包含硬链接的目录内容时,你会看到没有特殊的链接指示说明。当一个硬链接被删除时,这个链接被删除,但是文件本身的内容仍然存在, 直到所有关联这个文件的链接都删除掉。
ln filename hardlink
符号链接
符号链接(也称为软链接或者 symlink ),类似于windows中的快捷方式,让多个文件名指向同一个文件。创建符号链接是为了克服硬链接的局限性。符号链接生效,是通过创建一个特殊类型的文件,这个文件包含一个关联文件或目录的文本指针。如果你往一个符号链接里面写入东西,那么相关联的文件也被写入。然而, 当你删除一个符号链接时,只有这个链接被删除,而不是文件自身。如果先于符号链接删除文件,这个链接仍然存在,但是不指向任何东西。这个链接被称为坏链接。
A是B的软链接(A和B都是文件名),A的目录项中的inode节点号与B的目录项中的inode节点号不相同,A和B指向的是两个不同的inode,继而指向两块不同的数据块。但是A的数据块中存放的只是B的路径名(可以根据这个找到B的目录项)。A和B之间是“主从”关系,如果B被删除了,A仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
比如一个典型的应用是,多个程序需要使用某一个共享链接文件,但是这个文件经常改变版本,而随着版本号的改变文件名也发生了改变。那么我们就必须跟踪每个可能使用了这个共享链接文件的程序,每当文件更新一次新版本,都要更改所有使用该文件的程序。
这时,我们可以使用符号链接来解决这个问题,比方说,我们安装了文件 “foo” 的 2.6 版本,它的 文件名是 “foo-2.6”,然后创建了叫做 “foo” 的符号链接,这个符号链接指向 “foo-2.6”。 这意味着,当一个程序打开文件 “foo” 时,它实际上是打开文件 “foo-2.6”。当升级到 “foo-2.7” 版本的时候,仅添加这个文件到文件系统中,更改符号链接 “foo”指向新版本即可。这有些类似于c语言中宏定义的符号常量,而不是别名。
ln -s filename softlink
用 GUI 来创建符号链接
文件管理器 GNOME 和 KDE 都提供了一个简单而且自动化的方法来创建符号链接。 在 GNOME 里面,当拖动文件时,同时按下 Ctrl+Shift 按键会创建一个链接,而不是复制(或移动)文件。在 KDE 中,无论什么时候放下一个文件,会弹出一个小菜单, 这个菜单会提供复制,移动,或创建链接文件选项。