第三章 基本的bash shell命令
1.启动shell
大多数Linux发行版的默认shell都是GNU bash shell。
/etc/passwd
文件包含了所有系统用户账户列表以及每个用户的基本配置信息。例如:
christine:x501:501:Christine Bresnahan:/home/christine:/bin/bash
每个条目有七个字段,字段之间用:
分隔,每个字符都有其特定的含义,其中最后一个字段指定了用户使用的shell程序。
2.shell的提示符
默认bash shell提示符是美元符号$
,这符号白哦名shell在等在用户输入。不同的Linux发行版采用不同格式的提示符。提示符中显示了当前用户IDchristine
,系统名server01
。shell提示符可以根据自己的需要进行改变。在CLI输入命令后,需要按下回车键才会执行命令。
christine@server01:~$
3.bash手册
大多数Linux发行版本自带用以查找shell命令以及其他GNU工具信息的在线手册。bash手册是作为快速参考来使用的。
man
命令用来访问存储在Linux系统上的手册页面。在想要查找的工具的名称前面输入man
命令,就可以找到那个工具想要的手册条目。当使用man
命令查看命令手册的时候,这些手册由分页程序(pager)
来显示的。分页程序是一种实用的工具,能够逐页显示文本,通过点击空格进行翻页,使用回车逐行查看,q
退出。可以使用关键字搜索手册页:man -k 关键字
。
info
命令可以显示info页面的信息。大多数命令都可以接受-help
或--help
选项,可以查看帮助信息。
4.浏览文件系统
Linux文件系统
Linux在路径中不使用驱动盘符。Windows中,PC上安装的物理驱动器决定了文件的路径名。Windows会为每个物理磁盘驱动器分配一个盘符,每个驱动器都会有自己的目录结构,一遍访问存储其中的文件。Linux将文件存储在单个目录结构中,这个目录称为虚拟目录(virtual directory)
,虚拟目录将安装在PC上的所有存储设备的文件路径纳入单个目录结构中。
Linux虚拟目录只包含一个称为根(root)
目录的基础目录。Linux中使用/(正斜线)
而不是\(反斜线)
在文件路径中划分目录。Linux中反斜线用来标识转义字符,不能使用在路径中。
在Linux PC上安装的第一块硬盘称为根驱动器
,根驱动器包含了虚拟目录的核心,其他目录都是从这里开始构建的。Linux会在根驱动器上创建一些特别的目录,叫做挂载点(mount point)
。挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些过载点目录中,然而实际上他们却存储在另外一个驱动器中。下图中硬盘1和虚拟目录的根目录关联起来,而硬盘2被挂在到home目录。
Linux常见的通用目录以及作用
/
:虚拟目录的根目录,通常不会在这存储文件
/bin
:二进制目录,存放用户级的GNU工具
/boot
:启动目录,存放启动文件
/dev
:设备目录,创建设备节点
/etc
:系统配置文件目录
/home
:主目录,Linux在此创建用户目录
lib
:库目录,存放系统和应用程序的库文件
media
:媒体目录,可以的媒体设备的常用挂载点
mnt
:挂载目录,另一个可移动媒体设备的常用挂载点
opt
:可选目录,常用语存放第三方软件包和数据文件
proc
:进程目录,存放现有硬件及当前进程的相关信息
/root
:root用户的主目录
/sbin
:系统二进制目录,存放很多GNU管理员级工具
/run
:运行目录,存放系统运行时的运行数据
/srv
:服务目录,存放本地服务的相关文件
/sys
:系统目录,存放系统硬件信息的相关文件
/tmp
:临时目录,创建和擅长临时工作文件
/usr
:用户二进制目录,大量用户级GNU工具和数据文件存储位置
/var
:可变目录,用以存放经常变化的文件,如日志文件
常见的目录名均基于文件系统层级标准(filesystem hierarchy standard,FHS)
。
遍历目录
cd destination
cd
:将shell会话切换到另一个目录。cd
命令接受单个参数,指定切换到的目录名。如果没有指定目标路,他会切换到用户主目录。
绝对路径
:以根目录开始(/
),定义了在虚拟目录结构中该目录的确切位置,相当于文件的全名。如:/usr/bin
。
相对路径
:允许用户指定一个基于当前位置的目标文件路径。相对路径不以代表根目录的正斜线(/
)开头,而是以目录名或一个特殊的字符开始。有两个字符可以用于相对路径中单点符.
(表示当前目录)和双点符..
(表示当前目录的父目录)。如果对命令行和Linux目录结构不太熟悉,可以暂时坚持使用绝对路径,等熟悉了目录布局后,再使用相对路径。
pwd
:该命令可以显示出shell会话的当前目录,这个目录被称为当前工作目录
。在切换到新的当前工作目录时使用pwd
命令,是很好的习惯,因为很多shell命令都是在当前工作目录中操作的,在发出命令之前,你应该始终确保自己处在正确的目录中。
5.文件和目录列表
ls
:显示当前目录下的文件和目录。ls命令输出的列表是按字母排序的(按列排序而不是按行)。ls命令还可以以不同的颜色区分不同类型的文件,LS_COLORS环境变量控制着这个功能。使用-F
参数可以轻松区分文件和目录,-F
参数在目录名后加了/
。类似的,它会在可执行文件(事例中my_script)的后面加个星号,以示区分。
$ ls -F
Desktop/ Downloads/ Music/ Pictures/ Templates/
Documents/ examples.desktop my_script* Public/ test_file
Linux经常采用隐藏文件
来保存配置信息。在Linux中,隐藏文件以.
开始的文件,这些文件没有在默认的ls命令中显示出来,因此称为隐藏文件。要把隐藏文件和普通文件及目录一起显示出来,用到-a
参数。
$ ls -a
. .compiz examples.desktop Music test_file
.. .config .gconf my_script Videos
.bash_history Desktop .gstreamer-0.10 Pictures
-R
参数是ls
命令的另一个参数,叫作递归选项
。它列出了当前目录下包含的子目录中的文件。-l
参数会产生长列表格式输出,包含了目录中每个文件的更多相关信息。
$ ls -l
total 48
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Desktop
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Documents
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Downloads
-rw-r--r-- 1 christine christine 8980 Apr 22 13:36 examples.desktop
输出的第一行显示了目录中包含的总块数,在此之后,每一行都包含了关于文件/目录的下述信息:
文件类型
:目录(d),文件(-),字符型文件(c)或块设备(b)
文件权限
:读(r),写(w),执行(x)
文件的硬链接总数
:数字
用户属主的用户名
:christine
文件数组的组名
:christine
文件的大小
:4096(字节为单位)
文件的上次修改时间
:Apr 22 20:37
文件名或目录名
:Desktop,Document
更多的命令可以查看ls
的手册,man ls
。另外,可以将多个参数结合起来使用,如ls -alF
。
过滤输出列表
(实用):当ls
命令输出文件较多时,可以使用该命令,他会用过滤器决定在输出中显示哪些文件或目录。过滤器就是一个进行简单文本匹配的字符串。可以使用特定的文件名作为过滤器,也可使用模式匹配(正则表达式),模式匹配符包括以下几种****
$ ls -l my_script
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
问号(?)
:代表一个字符。
$ ls -l my_scr?pt
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
星号(*)
:代表零个或多个字符。
$ ls -l my*
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_file
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
在过滤器中使用星号和问号被称为文件扩展匹配(file globbing)
,指的是使用通配符进行模式匹配的过程。通配符正式的名称叫做元字符通配符(metacharacter wildcards)
,除了星号和问号,还有更多的元字符通配符用于文件扩展匹配。
中括号[]
:表示一个字符位置并给出多个可能的选择,也可指定字符范围,例如字母范围[a-i]。
$ ls -l my_scr[ai]pt
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
感叹号(!)
:将不需要的内容排除在外。
在进行文件搜索使,文件拓展匹配是一个强大的特性。
6.文件处理
touch
:创建空文件。创建指定的名称的新文件,并将你的用户作为文件的属主,新文件大小为0。touch命令还可以用来改变文件的修改时间,这个操作并不需要改变文件的内容。
$ touch test_one
$ ls -l test_one
-rw-rw-r-- 1 christine christine 0 May 21 14:17 test_one
$ ls -l test_one
-rw-rw-r-- 1 christine christine 0 May 21 14:17 test_one
$ touch test_one
$ ls -l test_one
-rw-rw-r-- 1 christine christine 0 May 21 14:35 test_one
cp source destination
cp
: 在文件系统中将文件和目录从一个位置复制到另一个位置。当source
和destination
参数都是文件名时,cp
命令将源文件复制成一个新文件,并且以destination命名。如果目标文件已经存在,cp
命令可能不会提醒,最好加上-i
选项,强制shell询问是否需要覆盖已有的文件。
$ cp -i test_one test_two
cp: overwrite 'test_two'? n
也可将文件复制到现有的目录中。
$ cp -i test_one /home/christine/Documents/
$
$ ls -l /home/christine/Documents
total 0
-rw-rw-r-- 1 christine christine 0 May 21 15:25 test_one
在这个例子中在目标目录名尾部加上了一个/
,这表明Documents是目录而非文件,有助于明确目的,而且在复制单个文件时非常重要。如果没有/
,子目录/home/christine/Documents
又不存在,就会有麻烦。这种情况下,试图将一个文件复制到Documents子目录反而会创建一个名为Documents的文件,连错误消息都不回显示。
-R
参数:cp
的- R
参数可以递归地复制整个目录的内容。
也可以在cp
命令中使用通配符。
制表键(Tab)自动补全:在使用命令行时,很容易输错命令,目录名或文件名。制表键自动补全允许你在输入文件名或目录名时按一下制表键,让shell帮忙将内容补充完整。使用制表键自动补全的技巧在于要给shell足够的文件名信息,使其能够将需要的文件同其他文件区分开。
链接文件:如需要在系统上维护同一个文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件和多个虚拟副本的方法。这种虚拟的副本就称为链接
。在Linux中,有两种不同类型的文件链接:
符号链接
:符号链接是一个实实在在的文件,指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同(具有不同的inode编号,Linux文件系统文件和目录具有唯一的inode号)。(我的理解符号链接为指针,指针存储指向文件的地址,指向的内容为文件)。要为一个文件创建符号链接,原始文件必须事先存在,然后使用ln
命令以及-s
选项来创建符号链接。
$ ls -l data_file
-rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file
$
$ ln -s data_file sl_data_file
$
$ ls -l *data_file
-rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file
lrwxrwxrwx 1 christine christine 9 May 21 17:29 sl_data_file -> data_file
硬链接
:创建独立的虚拟文件,其中包含了原始文件的信息及位置,但是他们从根本上是同一个文件。引用硬链接文件等同于引用了源文件,要创建硬链接,原始文件也必须事先存在,在使用ln
命令不需要加入额外的参数了。带有硬链接的文件共享inode编号。只能对处于统一存储媒体的文件创建硬链接,要想在不同存储媒体的文件之间创建链接,只能使用符号链接。(我理解为文件的副本,并且包含了位置等信息)
$ ls -l code_file
-rw-rw-r-- 1 christine christine 189 May 21 17:56 code_file
$
$ ln code_file hl_code_file
$
$ ls -li *code_file
296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56 code_file
296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56 hl_code_file
文件重命名:在Linux中,重命名文件称为移动(moving)
。mv
命令可以将文件和目录移动到另一个位置或重新命名。
$ ls -li f?ll
296730 -rw-rw-r-- 1 christine christine 0 May 21 13:44 fall
296717 -rw-rw-r-- 1 christine christine 0 May 21 13:44 fell
294561 -rw-rw-r-- 1 christine christine 0 May 21 13:44 fill
296742 -rw-rw-r-- 1 christine christine 0 May 21 13:44 full
$
$ mv fall fzll
$
$ ls -li f?ll
296717 -rw-rw-r-- 1 christine christine 0 May 21 13:44 fell
294561 -rw-rw-r-- 1 christine christine 0 May 21 13:44 fill
296742 -rw-rw-r-- 1 christine christine 0 May 21 13:44 full
296730 -rw-rw-r-- 1 christine christine 0 May 21 13:44 fzll
mv
命令只影响文件名,inode编号和时间戳保持不变。也可以使用mv
命令来移动文件的位置。
$ ls -li /home/christine/fzll
296730 -rw-rw-r-- 1 christine christine 0 May 21 13:44 /home/christine/fzll
$ ls -li /home/christine/Pictures/
total 0
$ mv fzll Pictures/
$ ls -li /home/christine/Pictures/
total 0
296730 -rw-rw-r-- 1 christine christine 0 May 21 13:44 fzll
$ ls -li /home/christine/fzll
ls: cannot access /home/christine/fzll: No such file or directory
和cp
命令类似,也可以在mv
命令中使用-i
参数。这样在命令试图覆盖已有的文件时,就会得到提示。
删除文件:在Linux中,删除叫做移除(removing)
,命令为rm
。-i
命令参数提示你是否真的删除该文件。bash shell中没有回收站或垃圾箱,文件一旦删除,就无法找回。因此,在使用rm
命令时,要养成总是加入-i
参数的习惯。
7.处理目录
创建目录:命令mkdir
。
$ mkdir New_Dir
$ ls -ld New_Dir
drwxrwxr-x 2 christine christine 4096 May 22 09:48 New_Dir
可以根据需要批量地创建目录和子目录。同时常见多个目录和子目录,需要加入-p
参数:
$ mkdir -p New_Dir/Sub_Dir/Under_Dir
$
$ ls -R New_Dir
New_Dir:
Sub_Dir
New_Dir/Sub_Dir:
Under_Dir
New_Dir/Sub_Dir/Under_Dir:
mkdir
命令的-p
参数可以根据需要创建缺失的父目录。父目录是包含目录树中下一级目录的目录。
删除目录:命令rmdir
,默认情况下,rmdir
命令只会删除空目录。对于非空目录的删除,使用-r
选项可以向下进入目录,删除其中的文件,然后在删除目录本身。rm -rf
命令没有警告信息,这是一个非常危险的工具,尤其是在拥有超级用户权限时,务必谨慎使用。
8.查看文件内容
Linux中有几个命令可以查看文件内容,而不需要调用其他文本编辑器。
file
:探测文件内部,决定文件是什么类型的。file
命令不仅能确定文件中包含的文本信息,还能确定改文件的字符编码,ASCII。
$ file my_file
my_file: ASCII text
查看整个文件:cat
命令可以显示文本文件中所有数据。-n
参数会给所有的行加上行号。如果只想给有文本的行加上行号,可以使用-b
参数。如果不想让制表符出现,可以使用-T
参数。适用于查看较短的文本。
more
命令:显示文本文件的内容,但会在显示每页数据之后停下来。more
命令时分页工具,和在手册中前后移动意义,可以通过空格或回车键逐行向前的方式浏览文本文件,q
退出。
less
命令:more
命令的升级版。
查看部分文件:如果查看的数据在文本开头或结尾,可以使用查看部分文件命令。
tail
命令:显示文件最后几行的内容,默认情况下,他会显示文件的末尾10行。-n
参数来修改所显示的行数。-f
参数是tail
的一个特性,允许在其他进程使用该文件时查看文件的内容。tail
命令会保持活动状态,并不断显示添加到文件中的内容,可以用来实时检测系统日志。
head
命令:显示文件的开头,默认情况下显示10行。-n
参数可以指定想要显示的内容。由于文件的开头通常不会改变,因此head
命令不支持-f
参数。
本章小结:
1.shell的基础知识
2.Linux文件系统基础知识。
3.文件的基本操作(创建,删除,移动,复制)。
4.目录的基本操作(创建,删除,移动)。
5.shell内建的查看文件命令(file,cat,less,more,head,tail)。
参考文献:Linux命令行与shell脚本编程大全(第三版)Richard Blum Christine Bresnahan著 门佳 武海峰译