一、系统功能
1.1 系统的运行级别
Linux系统有7个运行级别(runlevel):
- 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
- 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
- 运行级别2:多用户状态(没有NFS)
- 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
- 运行级别4:系统未使用,保留
- 运行级别5:X11控制台,登陆后进入图形GUI模式
- 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
系统原理:
- 在/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service)。
- 在/etc/rc.d下有7个名为rcN.d的目录,对应系统的7个运行级别。
- rcN.d目录下都是一些符号链接文件,这些链接文件都指向init.d目录下的service脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。
- 系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件。(对于以K开头的文件,系统将终止对应的服务;对于以S开头的文件,系统将启动对应的服务)
- 查看运行级别用:runlevel
- 进入其它运行级别用:init N
- 另外init0为关机,init 6为重启系统
由于现在的Linux系统安装完后就运行在第5个级别,即系统启动后直接进入图形界面,而不用在字符模式下登录后用startx或者xinit 来起动图形界面。
1.2 shell
分类:Bounrne shell(sh),korn shell(ksh),C shell(csh),Bourne-agin shell(bash),tcsh
不同的shell命令提示符不一样:
版本 | 管理员 | 普通用户 |
sh,Bash | #root | $user |
csh | #root | %user |
根据shell的调用方式分类:交互式注册Shell、交互式非注册Shell和非交互式Shell 三种。
二、命令行基础知识
2.1 命令行结构
格式:<命令名> <命令选项> <命令参数>
在命令语法中,凡是以方括号“[]”像是给出的命令选项均为可选项。
注意:命令选项通常是以减号“-”开始的单个字符,但是Liunx系统提供了以双减号“--”为起始标志的命令选项(通称为GNU选项)。
$ cd /etc/network;ls -l
上面命令虽然是一行,但是用分号分割,也就意味着这条命令的结束。与下面的命令是完全相同的。
$ cd /etc/network
$ ls -l
然而下面的命令与上面的命令可以得到同样的效果:
(cd /etc/network;ls -l)
结果虽然相同,但是意义却完全不同。以分号分割是在逻辑上进行了划分,与单行执行的意义完全相同;但是以括号包含,就把其中的命令看做是一个组合命令,输出的数据将会被合并为一个输出流。这二者的差别在管道操作中尤为明显。
2.2 后台进程
我们通常执行的是前台形式,在命令解释期间,用户需要等待命令执行完成,中间不能做任何事情。
后台进程使得我们执行命令无需等待命令执行完成,shell将会立即输出命令提示符,等待用户输入新的指令,从而并发的执行多个命令。
格式:在命令后面加一个“&”符号
注意:
- 当我们以后台进程的方式执行命令,会输出:[n] num 这样的输出中n表示的进程的作业号,num表示的是进程的PID。
- 如果后台进程有输出数据,其输出信息将会随时出现在用户的终端屏幕上,容易造成混乱。
2.3 标准输入/输出与错误输出
- 标准输入(stdin),文件描述符为0;
- 标准输出(stdout),文件描述符为1;
- 标准错误输出(stderr),文件描述符为2;
一旦注册到系统,系统总是为用户打开3个默认的文件:标准输入(键盘)、标准输出(终端屏幕)和标准错误错误(也是终端屏幕,用于输出错误信息)。
I/O重定向 | 简单说明 |
---|---|
<fname | 使用指定的文件作为标准输入(其文件描述符为0),以便从指定的文件中接收输入数据 |
>fname | 使用指定的文件作为标准输出(其文件描述符为1)。如果文件不存在,则创建命名的文件。如果文件存在且noclobber标志已经设置,将会产生错误;否则,清除文件中的原有的数据内容,然后在写入数据 |
>/fname | 除了忽略noclobber标志之外,其功能与“>fname”相同 |
>>fname | 使用指定的文件作为标准输出。如果文件存在,则把输出内容附加到文件后面;否则,创建指定的文件 |
<>fname | 以读写方式打开指定的文件,并使之作为标准输入 |
<<[-]fstr | 以指定的标志字符串fstr之后的文档(称为Here文档)作为标准输入,从fstr之后之后逐行读取数据,直到遇到第二个fstr(或EOF)标志。此时第一个fstr是标准输入的起始标志,第二个fstr(或EOF)是标准输入的结束标志。如果“<<后面附带减号”“-”标志字符,则Shell将会忽略后随文本行前面的制表符 |
<&digit | 使用指定的文件描述符复制一个标准输入 |
>&digit | 使用指定的文件描述符复制一个标准输出 |
<&- | 关闭标准输入,而“n<&-”则表示关闭输入文件文件描述符n |
>&- | 关闭标准输出,而“n>&-”则表示关闭输出文件文件描述符n |
<&j | 把标准输入重定向到文件描述符j表示的输入文件中 |
>&j | 把标准输出重定向到文件描述符j表示的输入文件中 |
&>fname | 把标准输出和标准错误输出均重定向到指定的文件中 |
注意:fname表示文件的名称,fstr表示一个字符串,digit表示文件描述符。
如果I/O重定向符号“<”或“>”前面有一个数字,则表示相应的文件描述符(默认值分别为0或1)对应的文件。
I/O重定向 | 简单说明 |
---|---|
0<fname | 把标准输入重定向到指定的文件中 |
1>fname | 把标准输出重定向到指定的文件中 |
1>>fname | 把标准输出重定向并附加到指定的文件中 |
2>fname | 把标准错误输出重定向到指定的文件中 |
2>>fname | 把标准错误输出重定向并附加到指定的文件中 |
i>&j | 把文件描述符i表示的输出文件重定向到文件描述符j表示的文件中 |
[j]<>fname | 以读写方式打开指定的文件,并把文件描述符j分配到指定的文件。若果文件不存在,则创建该文件。如果未指定文件描述符j,则表示默认的文件描述符0,即标注输入 |
示例1:
fxb@fxb-Ubuntu14:~/桌面$ pwd
/home/fxb/桌面
fxb@fxb-Ubuntu14:~/桌面$ LOGFILE=script.log
fxb@fxb-Ubuntu14:~/桌面$ echo "This line is written to log file." > $LOGFILE
fxb@fxb-Ubuntu14:~/桌面$ echo "This line is appended to log file." >> $LOGFILE
fxb@fxb-Ubuntu14:~/桌面$ echo "This line is appended to log file also." >> $LOGFILE
fxb@fxb-Ubuntu14:~/桌面$ echo "This line is echoed to stdout."
This line is echoed to stdout.
fxb@fxb-Ubuntu14:~/桌面$ cat script.log
This line is written to log file.
This line is appended to log file.
This line is appended to log file also.
从上面的示例中会在桌面创建script.log文件,并在文件中写入了三行字符串。
示例2:
fxb@fxb-Ubuntu14:~/桌面$ jjj
jjj:未找到命令
fxb@fxb-Ubuntu14:~/桌面$ ERRFILE=script.errors
fxb@fxb-Ubuntu14:~/桌面$ jjj 2>$ERRFILE
fxb@fxb-Ubuntu14:~/桌面$
上面的命令形式,可以把标准错误输出重定向到文件中,从而不会再标准输出(控制台)进行输出。
注意:I/O重定向的顺序是非常重要的。Shell会根据文件描述符(文件)出现的顺序决定I/O重定向的关联关系。
例如,下列I/O重定向命令意味着把命令的标准输出和标准错误输出均重定向到给定的文件中。
command 1>fname 2>&1
如果I/O重定向的顺序相反,则最终结果会是另一个样子。
command 2>&1 1>fname
最终结果是,命令的标准错误输出将会被写到标准输出,即在控制台显示。而命令的标准输出最终写到指定的fname中。
注意:子进程能够继承已经打开的文件描述符。为了防止文件被子进程继承,应注意随时关闭不在需要的文件描述符。
2.4 管道
管道是一种先进先出的单向数据通路。利用管道符号“|”,可以把一个命令的标准输出连接到另一个命令的标准输入。示例:
统计指定目录下的文件数量:
fxb@fxb-Ubuntu14:~/桌面$ ls /usr | wc -w
8
fxb@fxb-Ubuntu14:~/桌面$ ls /usr >temp;wc -w < temp
8
这两行代码的效果是一样的,但是第二种方式利用了文件temp,通过先写入,然后在读取的方式进行的。
管道的常见用法是为了滤通程序提供原始数据,有滤通程序读取来自标准输入的数据,按照指定的检索原则和模式,从输入数据中提取期望的、包含给定字符串的数据。
Linux系统提供了一个相当于三通管的使用程序tee。这个命令的主要功能是通过标准输入接收并显示数据,同事吧数据存储到指定的文件中。示例:
fxb@fxb-Ubuntu14:~$ who | tee userlist
fxb :0 2016-10-25 21:53 (:0)
fxb pts/0 2016-10-25 22:13 (:0)
fxb@fxb-Ubuntu14:~$ ls
examples.desktop userlist 公共的 模板 视频 图片 文档 下载 音乐 桌面
fxb@fxb-Ubuntu14:~$ cat userlist
fxb :0 2016-10-25 21:53 (:0)
fxb pts/0 2016-10-25 22:13 (:0)
上述示例中不仅在控制台进行了输出,还将输出结果保存到了userlist文件中。
2.5 元字符
元字符也称为通配符。
元字符 | 简单说明 |
---|---|
* | 可以匹配任意数量的字符或字符串 |
? | 可以匹配相应位置的一个字符 |
[...] | 由方括号定义的字符集或字符范围,可以使用其中任何一个字符匹配文件名相应位置的一个字符 |
[!...]或[^...] | 可以匹配任何一个不属于给定字符集范围的字符 |
如果了解“正则表达式”,你一定对这些完全不陌生。
注意:
- 任何元字符都不能匹配以句号“.”为首的隐藏文件名。只有通过显示匹配或者“.*”的方式进行匹配。
- 使用set命令的“-f”选项能够禁止文件名的生成。所以当Shell无法解释元字符时,应注意检查是否设置了这个标志。
2.6 命令别名
别名机制是通过alias和unalias命令实现的。
alias
- 作用:定义和列出用户设置的(包括系统定义的)命令别名
- 语法:alias [name [=value]]
当未指定参数的时候,就是进行查看操作,否则就是定义别名。
注意:如果value中有空格等空白字符,需要用引号引住。
value值可以包含多个命令,中间用分号隔开;也可以使用管道符号把多个命令连接起来,构成一个组合命令。
如果value值中含有变量,单双引号就有区别了。使用双引号,value中的任何变量经会在定义过程中进行变量替换;如果使用单引号value中的变量在调用命令别名之前不会进行变量替换。
fxb@fxb-Ubuntu14:~/桌面$ echo $PWD
/home/fxb/桌面
fxb@fxb-Ubuntu14:~/桌面$ alias dir1="echo Current working directory is $PWD"
fxb@fxb-Ubuntu14:~/桌面$ alias dir1
alias dir1='echo Current working directory is /home/fxb/桌面'
fxb@fxb-Ubuntu14:~/桌面$ alias dir2='echo Current working directory is $PWD'
fxb@fxb-Ubuntu14:~/桌面$ alias dir2
alias dir2='echo Current working directory is $PWD'
fxb@fxb-Ubuntu14:~/桌面$ dir1
Current working directory is /home/fxb/桌面
fxb@fxb-Ubuntu14:~/桌面$ dir2
Current working directory is /home/fxb/桌面
fxb@fxb-Ubuntu14:~/桌面$ cd /etc
fxb@fxb-Ubuntu14:/etc$ dir1
Current working directory is /home/fxb/桌面
fxb@fxb-Ubuntu14:/etc$ dir2
Current working directory is /etc
上面的示例不难看出,当在同一个目录下的时候,dir1与dir2输出使没有区别的,但是更换到其它目录时,就显示出其区别了。
unalias
- 作用:从字面上也不难看出,这条命令用于删除已经定义的命令别名。
- 格式:unalias [-a] [name ..]
“-a”选项用于删除已经定义的所有命令别名,包括系统定义的命令别名。
fxb@fxb-Ubuntu14:/etc$ dir1
Current working directory is /home/fxb/桌面
fxb@fxb-Ubuntu14:/etc$ dir2
Current working directory is /etc
fxb@fxb-Ubuntu14:/etc$ unalias dir1
fxb@fxb-Ubuntu14:/etc$ unalias dir2
fxb@fxb-Ubuntu14:/etc$ dir1
未找到 'dir1' 命令,您要输入的是否是:
命令 'dir' 来自于包 'coreutils' (main)
命令 'dirt' 来自于包 'dput-ng' (universe)
dir1:未找到命令
fxb@fxb-Ubuntu14:/etc$ dir2
未找到 'dir2' 命令,您要输入的是否是:
命令 'dir' 来自于包 'coreutils' (main)
命令 'dirt' 来自于包 'dput-ng' (universe)
dir2:未找到命令
2.7 作业控制
在Bash中,set命令的“-m”或“-o monitor”选项用于启用Shell的作业控制同能。前面所讲的启用后台进程时,就会显示出后台进程的作业号和PID值。
Shell采用作业控制表记录和跟踪当前作业。利用jobs内部命令,可以查看详细信息。
当前台进程运行时间较长,在执行期间我们可以使用Ctrl+Z键以及bg命令,把程序放入后台运行。
当按下Ctrl+Z时,会向Shell和当前成功逆袭发送一个STOP信号。收到信号后,Shell会输出一个表示作业已经停止(“Stopped”)的信息,我们使用bg命令把作业放到后台运行,或者在运行完成其他任务后,利用fg命令让作业回到前台运行。(通过%num指定作业)
通常,后台作业可以输出数据,但不允许从终端读取数据,读取数据就会停止运行。另外,如果使用“stty tostop”命令设置终端选项,将会禁止后台作业输出数据,当输出或读取数据,都会导致其停止。
Shell提供的选择后台作业的方法:
- %number 使用作业号引用后台作业
- %string 使用给定的字符串作为命令行起始字符串引用作业
- %?string 引用命令行含有给定字符串的作业
- %% 引用当前作业
- %+ 等价于%%,表示当前作业
- %- 引用前一个去哦也
在Ubuntu中,如果用户提交了后台作业,不管作业的当前运行状态如何,一旦使用exit命令、Ctrl+D键或关闭终端窗口退出系统,系统将不加警告的立即终止后台作业的运行。想要在退出系统后仍然确保后台运行的作业能够继续运行,直到正常结束,可以利用nohup命令实现(提交之前在命令的前方指定,也就是使用nohup命令调用其它命令)。nohup的功能是让调用的进程忽略SIGHUP信号,同时把进程的输入重定向到用户主目录下的nohup.out文件中。当需要提价一个运行时间很长,而用户又不想一直待在终端之前静等命令的最终处理结果时,可以借助于nohup命令。
在退出Shell时,系统会向用户注册Shell的所有子进程发送一个SIGHUP信号。通常这个信号将会引起用户的所有进程终止运行。
2.8 会话记录与命令确认
保存会话记录
通过script命令,可以记录一个用户从注册到退出系统的整个或部分绘画过程,包括用户的输入和系统的响应信息。(仅适用于字符终端设备)
通常,script命令捕捉的绘画过程将会记录在当前目录下的typescript文件中。为了使用不同的文件存储会话过程,可以在script命令之后指定一个不同的文件名。
为了依次记录用户的每一个注册会话过程,可以使用“-a”选项。否则script将会覆盖 原有的文件内容,删除先前的绘画记录。
示例一:
fxb@fxb-Ubuntu14:~/桌面$ script
脚本已启动,文件为 typescript
fxb@fxb-Ubuntu14:~/桌面$ date
2016年 10月 26日 星期三 01:27:05 CST
fxb@fxb-Ubuntu14:~/桌面$ uname -r
4.2.0-42-generic
fxb@fxb-Ubuntu14:~/桌面$ ls -l
总用量 12
-rw-rw-r-- 1 fxb fxb 0 10月 25 19:48 input~
-rw-rw-r-- 1 fxb fxb 365 10月 25 19:52 output~
-rw-rw-r-- 1 fxb fxb 0 10月 26 01:26 typescript
-rw-rw-r-- 1 fxb fxb 673 10月 25 19:37 命令保存
-rw-rw-r-- 1 fxb fxb 673 10月 25 19:36 命令保存~
fxb@fxb-Ubuntu14:~/桌面$ uptime
01:27:25 up 3:34, 2 users, load average: 0.38, 0.23, 0.16
fxb@fxb-Ubuntu14:~/桌面$ exit
exit
脚本完成,文件为 typescript
终止会话记录功能,可以使用exit命令。之后,我们可以使用cat、less、more或编辑器查阅typescript文件。
2.9 确保使用的命令是正确的
which命令
命令的执行顺序是PATH变量中列出的目录顺序,所以用户改变了PATH变量定义的检索路径的顺序,Shell究竟执行的是哪一个目录下的同名命令,则不得而知。因此,可以使用系统中的which命令予以验证。示例:
fxb@fxb-Ubuntu14:~/桌面$ which tar
/bin/tar
注意:which命令并不考虑内置命令,它仅检索并给出发现的第一个外部命令。
whereis命令
与which类似,用于检索与给定命令相关的文件(根据标准的目录位置,而不是检索路径)。示例:
fxb@fxb-Ubuntu14:~/桌面$ whereis tar
tar: /bin/tar /usr/lib/tar /usr/include/tar.h /usr/share/man/man1/tar.1.gz
上述例子发现了3个与tar有关的文件:tar命令本身、tar头文件、tar的联机文件。
apropos命令
当需要执行某个特定的处理任务,但又不知道确切的命令名字,甚至根本不知道使用什么命令时,可以借助于apropos命令,利用关键字检索可用的命令。apropos将会利用提供的关键字,检索所有手册页中的命令简述部分,找出匹配的命令。实际上,apropos与“man -k”命令的功能完全一样。
whatis命令
与apropos命令可以执行模糊检索相比,whatis命令只能检索与给定关键字完全匹配的命令。
三、命令历史
命令历史机制主要是由Shell提供的下列内部命令和环境变量实现的。
- fc:用于列出(“-l”选项)、编辑(“-e”选项)或重新执行命令历史文件中记录的命令。
- history:用于列出命令历史缓冲区或文件中记录的命令。
- HISTFILE:用于指定命令历史文件。默认的命令历史文件为$HOME/.bash_history。
- HISTSIZE:指定命令历史文件中保存命令的数量。默认容量是500。
- HISTFILESIZE:指定历史文件的大小。
3.1 fc命令
内置命令fc,可以按照命令序号或利用命令的起始字符(或字符串)显示、编辑或运行先前执行的命令。语法:
fc [ -e ename] [-nlr] [first [last]]
fc -s [old=new] [command]
第一种方式:
first与last指定范围,也可以是一个字符串,用于匹配最近执行的、以给定的值为起始字符串的命令;(如果序号前面加上“-”号,则表示相对当前命令的偏移值)。没有指定开始和结束,则默认进行显示最近执行的16个命令。
“-l”选项,显示操作。“-n”省略序号的显示。“-r”由近至远反向输出选定范围的命令。如果“-nlr”3个选项都没有指定,则调用指定或默认的编辑器进行编辑。
“-e”选项用于定义在矫正或编辑先前的命令时使用的编辑器。在完成命令的编辑后,退出时即可输出并按照顺序重新执行刚才校正过的命令。
第二种方式:
这种方式表示跳过编辑阶段。如果存在“old=new”形式的字符串替换,则Shell将重新执行替换后的命令。如果未给出命令,则表示执行之前刚执行的命令。
示例,重复执行先前的ls命令:
fxb@fxb-Ubuntu14:~/桌面$ ls -l /etc/profile
-rw-r--r-- 1 root root 665 2月 20 2014 /etc/profile
fxb@fxb-Ubuntu14:~/桌面$ fc -s
ls -l /etc/profile
-rw-r--r-- 1 root root 665 2月 20 2014 /etc/profile
重复执行先前的第号命令:
fxb@fxb-Ubuntu14:~/桌面$ fc -l
37 ls /usr >temp;wc -w < temp
38 who | tee userlist
39 ls
40 cat userlist
41 fc -hlep
42 fc -h
43 clear
44 man ls
45 man fc
46 fc -l
47 fc -l 10 20
48 fc -l cat
49 fc -l
50 clear
51 ls -l /etc/profile
52 clear
fxb@fxb-Ubuntu14:~/桌面$ fc -s 51
ls -l /etc/profile
-rw-r--r-- 1 root root 665 2月 20 2014 /etc/profile
更改先前执行过的命令,然后执行:
fxb@fxb-Ubuntu14:~/桌面$ ls -l /etc/profile
-rw-r--r-- 1 root root 665 2月 20 2014 /etc/profile
fxb@fxb-Ubuntu14:~/桌面$ fc -s profile=apm
ls -l /etc/apm
总用量 16
drwxr-xr-x 2 root root 4096 2月 18 2016 event.d
drwxr-xr-x 2 root root 4096 2月 18 2016 resume.d
drwxr-xr-x 2 root root 4096 2月 18 2016 scripts.d
drwxr-xr-x 2 root root 4096 2月 18 2016 suspend.d
3.2 history命令
显示命令历史记录中的命令。(在Bash中,通常会列出所有命令,而在Korn Shell中,仅列出16条命令)。格式:
history -number
会列出最近执行的number条命令,没有指定则列出所有命令。
清除命令历史缓冲区中的命令:
history -c
注意:命令历史机制仅适用于交互式Shell,不能再Shell脚本中使用。
3.3 重复执行先前的命令
在Bash中,可以利用“!”引用机制实现。若要不加修改的重复执行最近刚执行的命令,可以使用“!!”命令。
“!string”命令表示重新执行最近执行的以给定的“string”为起始字符串的命令。
“!?string[?]”命令表示重新执行最近的,其中包含给定字符串的命令。
“!n”表示重复执行命令历史中的第n号命令。
“!-n”表示重复执行最近执行的倒数第n号命令。
“!!:[g]s/old/new[/]”命令,可以修正刚执行的命令,然后在执行。“字符g”的功能是替换命令行中的多个匹配的字符串。
常用的部分“!”命令:
3.4 编辑并执行命令
后期补充——————》
3.5 命令行补充
利用Linux提供的Readline库,Bash还支持命令行补充功能。当输入的命令名、文件名或变量名不完整时,可以使用制表符键“Tab”实现命令的补充。
命令名补充
如果找不到匹配的命令,Bash将会发出鸣叫声。如果恰好发现一个匹配命令,则会自动补充剩余部分,如果发现多个匹配命令,Bash将不会输出任何信息,在按下Tab键之后,Bash将会显示一系列其前缀与用户输入部分匹配的命令,然后允许用户采用同样的方式继续完成命令的选择。
文件名补充
操作类同,当匹配的到多个文件名时,Bash会尽可能的填充文件名的后续部分,直到遇到某个分界点需要用户做出进一步的选择。但是如果连续按下两次Tab键,将会显示出所有的文件名称,供用户进行选择。
变量名补充
操作与上面类同。
配置Readline库
后期补充——————》
四、常用命令
4.1 联机帮助
格式:
man name
man -k keyword
使用技巧:
- 回车->下一行
- 空格->下一页
- b->向前翻页
- f->向后翻页
- q->退出联机帮助
- /string->查找符合string指定的信息
- n->查找下一个符合string指定的信息
常用命令:
- clear:清屏
- pwd:显示当前目录
- ls:显示文件夹中的内容。
- cat:显示文件中的内容
图形界面进入命令界面:Ctrl+Alt+F2
参考资料: