1. 命令行
1.1 语法
命令行语法说明了行中各个元素的排列顺序和间隔方式。命令行上基本语法格式如下:
command [arg1] [arg2]...[argn] RETURN
命令行上采用一个或多个空格来隔开每个元素。其中,command为命令的名字,arg1到argn为命令参数,RETURN是终止命令的按键。
命令行上,每一串不含空格字符的字符序列称为记号或字。参数是一种记号,每个参数都有编号,其中命令本身作为参数0。
选项是改变命令执行效果的参数,可通过指定多个选项使命令按照不同的方式执行。当需要多个选项时,可将多个单字符组合成一个参数,例如"ls -xr"等同于"ls -x -r"。
有些工具的选项也需要带参数,例如工具gcc的-o选项后必须跟gcc产生的可执行文件名,通常选项与参数间用空格分开。
1.2 处理命令行
当向命令行输入命令时,Linux的tty设备驱动程序将检查每个字符。例如按下CONTROL+H、CONTROL+W或CONTROL+U里,设备驱动程序将立即根据按键的功能要求调整命令行。当输入的字符不需要采取立即的动作时,设备驱动程序将把字符存储在缓冲区中,等待字符输入。当按下RETURN键后,设备驱动程序将把命令行传递给shell处理。
当shell处理命令行时,它将把命令行作为一个整体来对待,并将其分成几个组成部分,接着shell将在指定目录下查找用户具有执行权限的对应文件。shell并不是在所有目录下搜索,而只在PATH变量设定的路径下搜索。
如果shell找到了与命令行上的命令具有相同名字的可执行文件,那么shell将启动一个新的进程,并将命令行上的命令名、参数、选项传递给程序。当命令执行时,shell将等待进程的结束,这时shell处于非活跃状态,称为休眠状态。当程序执行完毕,就将退出状态传递给shell,这样shell就返回到活跃状态,显示提示符,等待下一个命令的输入。
1.3 内置命令
内置命令是放在shell内的工具,每个shell都有自己的内置命令集合,当运行内置命令时,shell并不产生新的进程,这使得内置命令运行得很快,并且能影响当前shell环境。输入命令"info bash builtin"即可得到bash内置命令的完整列表,而tcsh内置命令可以在"man tcsh"中查找。
2. 标准输入输出
2.1 屏幕文件
默认情况下,shell将把命令的结果标准输出到屏幕,也可以重定向到其他文件。Linux中除了普通文件、目录文件、硬链接和软链接外,还有一种设备文件,设备文件驻留在Linux文件结构中(通常是/dev),用来代表外围设备,如终端模拟器窗口、显示屏、打印机和硬盘。
在who工具显示的内容中,登录名后的设备名即为屏幕的文件名,如pts/4。每个打开的窗口都有对应的设备名,在这些窗口中运行tty工具即可得到它们各自的名称,如下所示:
2.2 键盘和屏幕
当用户直接执行命令时,shell将其标准输出发送到代表屏幕的设备文件中,另外,shell还将键盘输入作为标准输入接收。
例如cat工具,在shell提示符后输入cat,按下RETURN,再输入一行文本后按下RETURN键,那么刚刚输入的文本下面一行将显示同样的一行内容。由于shell将cat的标准输入关联到键盘,标准输出关联到屏幕,所以当输入一行文本时,cat将键盘的输入内容显示到屏幕上。可以按下CONTROL+D发送EOF信号,表示标准输入结束,这时cat工具将停止运行并将控制返回到shell,如下所示:
2.3 重定向
重定向是指改变shell标准输出来源和标准输出去向的各种方式。如shell将cat的标准输入关联到键盘,标准输出关联到屏幕,也可以将shell的标准输入输出重定向到某个命令或者文件。
通过重定向符号">"可以将shell命令的输出重定向到指定的文件,命令行格式为:
command [args] > filename
其中,command为可执行程序,arguments是可选参数,filename是shell要重定向输出到的普通文件名,如下所示:
与重定向标准输出一样,也可以重定向标准输入。通过符号"<"可以使shell将命令的输入重定向为来自指定的文件而不再是键盘,命令行格式为:
command [args] < filename
其中,command为可执行程序,arguments是可选参数,filename是要重定向输入来自的普通文件,如下所示:
2.4 避免文件重写
shell提供了noclobber功能,用于防止重定向时不经意地重写了已存在的文件。通过设置变量noclobber可以启用此功能。启用后若重定向输出到某个已存在文件,则shell将报告错误消息,并不执行重定向命令,如下所示:
在重定向输出符号后跟管道符号(tcsh下使用叹号),即" >| "可以忽略noclobber的设置。
2.5 追加标准输出
使用追加输出符号">>"可以向某个文件末尾添加新的内容,并且不改变原有内容,如下所示:
2.6 数据消失
/dev/null是一个数据接收器,通常称为位桶。可以将不想看到或不想保存的数据重定向到/dev/null,这样输出数据将消失,如下所示:
当从/dev/null中读取数据时,将得到一个空字符串。
2.7 管道
shell使用管道将一个命令的输出直接连接到另一个命令的输入。管道的功能类似于将一个命令的标准输出重定向到一个文件,然后将该文件作为另一个命令的标准输出。管理的符号为" | ",语法格式为:
command_a [args] | command_b [args]
如下所示:
过滤器是将输入数据处理后再输出数据流的一类命令,包含过滤器的命令行用一个管道将某个命令的标准输出连接到过滤器的标准输入,用另一个管道将过滤器的标准输出连接到另一个命令的标准输入,如下所示:
tee工具可以向两个方向输出:文件和标准输出,如下所示:
3. 后台程序
3.1 作业
当在前台运行命令时,shell将一直等到命令执行完毕,shell会给出提示符使用户可以继续输入下一个命令,当命令在后台运行时,不必等待该命令完成,就可直接输入另一个命令。
作业是指由一个或多个命令组成的序列,后台可以有多个作业运行。如果在命令行末尾输入与符号"&"后按RETURN键,那么shell将在后台运行这个作业,同时,shell会给这个作业分配一个作业编号,将其显示在方括号内,如下所示:
3.2 移动作业
按下CONTROL+Z,shell将把前台的作业挂起,并终止作业中的进程,用bg命令后跟作业编号可以将挂起的作业放到后台运行,如果仅有一个作业被挂起,可以不指明作业编号,如下所示:
只有前台作业可以从键盘获得输入,输入fg后跟作业编号可以将对应的作业移到前台,如下所示:
3.3 终止作业
命令行上输入kill后跟进程的PID号(或后跟%和作业编号),可以将后台正在运行的进程终止,如下所示:
如果忘记了某个进程的PID号,可以用ps工具查看,如下所示:
如果忘记了作业编号,可以使用命令jobs来显示作业编号列表,如下所示:
4. 路径扩展
4.1 通配符
当输入包含特殊字符的部分文件名时,shell可以生成与已有文件的名字匹配的文件名。这些特殊的字符也常常被称为通配符,当某个通配符作为参数出现在命令行上时,shell将该参数扩展为有序的文件名列表,并将列表传递给命令行上调用的程序,包含通配符的文件名称为模糊引用,对这些文件名操作的过程称为路径名扩展。
4.2 问号
问号"?"是shell生成文件名的特殊字符,它与已有文件名中的某个单独字符芬配,如下所示:
问号不与隐藏文件匹配,如果要与隐藏文件匹配,必须在模糊文件引用中显式地包含句点。
4.3 星号
星号"*"的功能与问号相似,不同的是,星号可以与文件名中的任意多个(包括0)字符匹配,如下所示:
4.4 包含
用方括号将一个字符列表括起来使得shell与列表中每个单独字符匹配。方括号定义了一个字符类,每个定义字符类只能替换文件名中的一个字符,如下所示:
左方括号后直接跟叹号" ! "或脱字符也可以定义字符类,该类与任何不在方括号内的字符匹配。
转载于:https://blog.51cto.com/hanviseas/1057436