命令行:当在命令提示符后输入命令并按 ENTER 键后, shell 将执行相应的程序。包括命令和参数的行称为命令行。
Command [arg1] [arg2] [arg3]....[argn] RETURN
命令行上采用一个或多个空格来隔开每个元素。 arg 为参数,方括号表明被括起来的参数为可选项。选项是一种特殊类型的参数,其前面通常是一个或两个连字符。参数都有编号,其中命令本身作为参数 0 ,它是命令行参数的开始。选项是改变命令执行效果的参数,选项与特定的程序相关,并由命令行上调用的程序解释,而不是 shell 解释。按照约定,选项是跟在命令之后其他参数之前的单独参数。多数命令的选项前面需要带一个连字符,这个要求是与工具相关的,而与 shell 无关。 GNU 选项前面通常带两个连字符( --help )。当需要多个选项时,可将多个单字符组合成一个参数,以一个连字符开始,在选项间不要加空格。这样合并后的选项之前不能使用两个连字符。
Df 为 disk free 的简写。
>df -h
>ls -lh
选项 '-h' 显示可读文件的大小,以千字节 兆字节或千兆字节的方式显示文件大小。
df : report file system disk space usage ,显示参数给定文件所在的文件系统的信息,默认是显示所有文件系统。
>su
>fdisk -l
>exit
有些工具的选项也需要参数,如工具 gcc 的 '-o' 选项后必须跟 gcc 产生的可执行文件名。
>gcc -o example example.c
工具的参数 ( 如文件名 ) 是允许以连字符开始的
>cd ~
>ls -l
上面命令行可以解释为显示文件 '-l' ,也可解释为给出工作目录下所有文件列表; linux 选择后者。应该避免这种情况的出现,避免创建带连字符的文件名。一些命令约定使用 '--' 参数来表示选项的结束和参数的开始。
>ls -- -l
>ls ./-l
>pwd
>ls ~/-l
>ls -l -- -l
这些是约定而不是规定,有些工具并不支持。
注意于下列用法中的 '-' 的区别:
>cat example.c – example2.c
>bunzip2 -c example.tar.bz2 | tar -xvf -
处理命令行:当向命令行输入命令时, linux 的 tty 驱动程序( Linux 操作系统内核的一部分)将检查每个字符,来确定是否立即采取动作。例如 CONTROL + U 删除行键时,设备驱动程序将立即根据按键的功能要求调整命令行,当不需要立即采取行动时,设备驱动程序将把字符存储在缓冲区中,等待字符输入。当按 return 后,设备驱动程序将把命令行传递给 shell 处理。
分析命令行:当 shell 处理命令行时,它将命令行作为一个整体来对待,并将其区分为几部分。命令行中提示符后的第一项通常为命令名,因此 shell 将把命令行中从第一个字符到第一个空白字符之间的字符串作为命令名。命令名可以用简单的文件名或路径名的方式指定。
>pwd
>ls -l
>/bin/ls -l
shell 并不要求程序名必须首先出现在命令行上,也支持
> >bb aa< cat
标准输入来自文件 aa 标准输出到文件 bb 。当 shell 识别出重定向符后,它将在找到命令行调用的程序名前处理这些符号以及它们的参数。为程序的执行建立环境?
执行命令行: shell 找到了与命令行上的命令具有相同名字的可执行文件,那么, shell 将创建一个进程执行该可执行文件,并将命令行上的命令名 参数 选项传递给该进程,当命令执行时 shell 等待进程的结束,休眠状态。当程序执行完毕,就将退出状态传递给 shell ,这样 shell 就返回到活跃状态,显示提示符,等待下一个命令的输入。
shell 不处理进程的参数,只是将他们传递给调用的程序,所以 shell 不知道选项和参数是否对程序有效。所有关于选项和参数的错误消息和用法消息都是来自程序自身。
标准输出 是指程序输出信息的地方。程序本身并不知道他发送到标准输出的信息究竟要送往何处。
标准输入 是指程序信息的来源。程序同样也不知道信息的来源。
对一个运行的程序来说,除了具有标准输入和标准输出以外,通常还有错误消息输出,称为标准错误输出。
>bash
>bash
>exit
>exit
在命令提示符后 输入要使用的 shell 名(如 bash tcsh ),然后 return ,则出现的提示符为新 shell 给出的。输入 exit 命令可退回到前一个 shell 。 shell 是嵌套的,所以只能从最初的 shell 注销。
设备文件驻留在 linux 文件系统中(通常位于目录 /dev )用来代表外围设备,如终端模拟器窗口 显示屏 打印机和硬盘驱动器。
>who
>tty
每个打开的窗口都有对应的设备名。在这些窗口中运行 tty 工具即可得到他们各自的名称。通常把这个设备文件看作是一个文本文件进行读写,如屏幕上显示的内容被写入到该文件,键盘输入的内容从该文件中读取。
>cat
This is a line of text
This is a line of text
CONTROL-D
>
若 cat 后不带参数,那么 cat 将从标准输入获取输入,它把标准输入内容逐行地复制到标准输出。 CONTROL + D 为 EOF 信号,该信号表明标准输入结束,没有文本可复制。 若把某个文件名作为参数,那么 cat 将把该文件作为它的输入。
重定向是指改变 shell 标准输入来源和标准输出去向的各种方式。
通过重定向符 '>' 可以将 shell 命令的输出重定向到指定的文件而不再是屏幕。
Command [arg] > filename
利用 cat 将标准输入关联到键盘,标准输出被关联到指定文件 example.c 。重定向可能覆盖原有文件,如果原文件存在则重写并覆盖。不存在则创建新文件。
>cat > example.c
This is a line of text
CONTROL – D
>cat example.c
使用 cat 将一个或多个文件一个接一个地连接成一个较大文件:
>cd ~
>rm example*
>ls -l
>cat >example.c
This is example.c
CONTROL+D
>cat >example1.c
This is example1.c
CONTROL+D
>cat >example2.c
This is example2.c
CONTROL+D
>cat example*
>cat example* >example3.c
>cat example3.c
>ls -l
通过重定向符 '<' 可以使 shell 将命令的输入重定向为来自指定的文件而不再是键盘。重定向输入命令行格式:
command [arg] < filename
>cat example3.c
>cat <example3.c
将 cat 的输入重定向到文件的执行结果与命令 cat 后跟文件名作为参数的执行结果相同。这种特性属于 linux 的一类工具,这类工具首先检查调用他们的命令行,如果命令行上存在文件名,那么这类工具就把指定的文件作为输入。否则将标准输入作为输入。这种特性是该类工具自身所有的,而与 shell 或者操作系统无关。
>cat example1.c example2.c
>cat example1.c example2.c > example1.c
>cat example1.c example2.c
上面命令行 cat 报告错误信息,但 shell 再收到报告之前就覆盖了已存在文件 example1.c 的内容。命令执行后 example1.c 和 example2.c 内容相同,这是由于当 shell 遇到重定向符时 '>' 首先采取的动作是删除 example1.c 原来的内容。然后才是 cat 的执行。
>cat example1.c example2.c > example4.c
>mv example4.c example1.c
>cat example1.c
>cat example3.c>>example1.c
>cat example1.c
使用 '>>' 追加符可以向某个文件末尾添加新的内容,并且不改变原来已有内容。为了避免不小心覆盖了原来已存在文件,最好还是在采用这种方式操作文件前对文件进行备份。
>date > whoson
>cat whoson
>who >>whoson
>cat whoson
设备 /dev/null 是一个数据接收器,通常被称为位桶 (bit bucket) ,可以将不想看见或者不想保存的数据重定向到 /dev/null ,这样输出数据不留痕迹地消失:
>echo 'Hello linux' >/dev/null
>ls -l example.c
>cat example.c
>cat /dev/null > example.c
>ls -l example.c
>cat example.c
>tty
>echo 'hello linux' > /dev/pts/0
>who
>echo 'hello pts/1' > /dev/pts/1
>cat example.c > /dev/pts/1
管道: linux 使用管道将一个命令的输出直接连接到另一个命令的输入。管道类似于下面的过程,首先将一个命令的标准输出重定向到一个文件,然后将该文件作为另一个命令的标准输入。管道不会单独处理每条命令,并且不需要中间文件。
Command_a [arga] | command_b [argb]
上面命令得到的结果与下面结果相同:
command_a [arga] > temp
command _b [argb] < temp
rm temp
管道不仅可以简化输入,同时效率更高,因为他不会产生中间临时文件。
>ls -li | grep example
>tar -cvf all.tar example.c example2.c
>bzip2 -kv all.tar
>tar -tvf all.tar
>mkdir example
>mv all* example
>cd example
>ls -l
>tar -xvjf all.tar.bz2
>bunzip2 -c all.tar.bz2 | tar -xvf -
>cd ..
>rm -r example
>ls -l
任何 linux 工具都可以使用管道从命令行上指定的文件中接受输入,也可以从标准输入接受输入。有些使用管道的命令仅从标准输入接受输入。
Tr 只能从标准输入接受输入而不能从文件接受输入,管道是利用将两个命令的标准输入与输出进行互相关联工作,对每一个命令来讲,他并不知道标准输入是什么,他只是通过固定的文件描述符(有些系统叫文件句柄)来定义标准输入或标准输出。而不关心具体的标准输入或输出是什么,对于他来讲都将其看着一个普通文件而已。这里的重温件接受输入是指文件作为参数时?是工具本身的要求。
Tr string1 string2
在标准输入上查找与 string1 中字符匹配的字符,找到后将其替换为 string2 中对应位置的字符;并输出到标准输出上, tr 是从标准输入获得输入,所以不能改变文件(如果将文件重定向到标准输入)内容。
>cat example.c | tr abc ABC
>tr abc ABC < example.c
>tr abc ABC
dagagawrhaja
CONTROL+D
>cat example.c
上面上行命令:第一个利用管道将标准输入重定向到工具 cat 的标准输出,第二个利用重定向符将标准输入进行了重定向,第三个使用默认的标准输入。
Lpr 可以从文件接受输入也可从标准输入接受输入。
>ls >temp
>lpr <temp
>lpr temp
>rm temp
>ls | lpr
sort 可以从文件接受输入也可以从标准输入接受输入。
>who >temp
>sort <temp
>sort temp
>rm temp
>who | sort
>who | grep ‘terry’
>ls -li | less
过滤器是将输入数据流处理后再输出数据流的一类命令。包括过滤器的命令行用一个管道将某个命令的标准输出连接到过滤器的标准输入,用另一个管道将过滤器的标准输出连接到另一个命令的标准输入。并不是所有工具都可用作过滤器。
>who | sort | lpr
shell 可以组合多个 linux 工具来实现更强大的功能。其中的工具并不需要因为相互协作而进行特殊设计,他们都仍然按照约定使用标准输入和标准输出。通过 shell 对输入输出进行控制,用户可以在命令行将多个工具组合起来实现目标。
Tee 向两个方向输出,将标准输入复制到每个指定的文件和标准输出。它只有一个输入但是输出到两个方向。
>who | tee who.out | grep terry
>cat who.out
>ls
前台:当前台运行命令时, shell 将一直等到命令执行完毕, shell 会给出提示符使用户可以继续输入下一个命令。当命令在后台运行时,不必等待该命令完成,就可以直接输入另一个命令。
作业:作业是指一个或者(可通过管道连接的)多个命令组成的序列。前台只能有一个作业位于窗口或者屏幕中,但是可以有多个作业在后台运行。
作业编号与 PID 号 如果命令行末尾输入与符号 & 后按 RETURN 键,那么 shell 将在后台运行这个作业, shell 会为该作业分配一个作业号并显示该作业号,在作业号后显示进程标识号( PID )。
>gedit example.c &
>xclock &
>jobs
>fg %1
CONTROL+Z
>bg %1
>fg %2
CONTROL+C
>jobs
>kill %1
>jobs
CONTROL+Z 程序挂起键, shell 将把前台的作业挂起,并终止作业中的进程,将作业的标准输入与键盘断开。用 bg 命令后跟作业编号可以将挂起作业放到后台运行。
只有前台作业可以从键盘获得输入。为了将键盘和后台某个正运行的作业连接起来,必须把该后台作业移到前台。输入 fg (或者%)后跟作业编号可以将对应作业移到前台运行。
为了避免后台作业干扰前台作业,可以将后台作业的输出重定向。
命令行上输入 kill 后跟进程的 PID 号(或者后跟%和作业编号),可以将后台正运行的进程(或作业)终止。使用中断键( CONTROL + C )不能实现后台作业终止 ( 只能对前台作业有效 ) 功能的。
>ps
>xclock &
>gedit &
>jobs
>ps | grep gedit
>kill 12049
>ps
>jobs
>kill %1
>ps
>jobs
>pstree
>ps -elf
如果忘记了某个进程的 PID 号,则可以使用 ps 工具来显示该编号。如果忘记了作业标号,可以使用 jobs 来显示作业编号列表。
通配符和通配:当输入包含特殊字符的部分文件名时, shell 可以生成与已有文件的名字匹配的文件名。这些特殊的字符也常常称为通配符。当某个特殊字符作为参数出现在命令行上时, shell 将该参数扩展为有序的文件名列表,并将列表传递给命令行上调用的程序。被调用程序并不知道是 shell 生成了文件名。
'?' : 它与已有文件名中的某个单独字符匹配。
>touch example.c example1.c example2.c example3.c example4.c
>ls -li example*
>cat example?.c
>echo example?.c
>echo example*
>cat example*
>echo *
>echo .*
'*' :可以与文件名中任意多个(包括 0 个)字符匹配。
用方括号将一个字符列表括起来使得 shell 与列表中每个单独字符进行匹配。 example? 匹配 example 后跟任何一个字符文件名,而方括号更严格一些, memo[17a] 仅与 memo1 memo7 memoa 匹配。
>echo [aefgou]*
>less page[2468].txt
>lpr example1 example2 example3 example4 example5 example9
>lpr example[123459]
>lpr example[1-5 9]
>lpr example[0-9] example[12][0-9] example3[0-8]
>echo [a-m]*
>echo *[x-z]
>ls *[^ab]
>ls [b-d]*
>ls ?old
>ls /?old
将特殊字符进行转义, shell 将不在将其看作特殊字符。大多数工具和程序不能翻译模糊文件的引用,该翻译工作由 shell 完成。
模糊文件引用由 shell 进行扩展,而不是由 shell 调用的程序进行扩展, shell 对模糊文件引用进行扩展,并将扩展得到的文件列表传递工具。 echo 验证了这一点,因为它显示了参数而不是模糊文件引用 。
内置命令是放置在 shell 内的工具。每个 shell 都有自己的内置命令集合。当运行内置命令时, shell 并不产生新的进程,这使得内置命令运行得很快,并且能影响当前 shell 的环境。 shell 总是在查找命令或者是工具之前执行 shell 内置命令。