目录
8.1 shell 的启动和终止
8.2 输入输出重定向
8.2.0 标准输入输出
8.2.1 输出重定向 >
8.2.2 输入重定向 <
8.2.3 常见输入输出重定向形式
8.2.4 标准错误输出重定向
8.3 管道
Linux 系统中的 shell 具有两大功能:
- 是一个命令解释器:解释用户发出的各种操作系统命令
- 是一种程序设计语言:功能强大,可包容引用所有的操作系统命令和可执行程序
8.1 shell 的启动和终止
1、shell 的启动
当系统启动时,OS 的核心程序 init 自动为每一个终端建立一个名为 getty 的进程。getty 进程在终端屏幕上显示:
login: # 提示输入用户名
passwd: # 提示输入密码
系统接收密码并与 /etc/passwd 文件中用户相关信息相比较,如果一致,则进入系统。系统根据 /etc/passwd 文件中的相关参数给该用户启动一个指定类型的 shell 进程,专门用于解释执行该用户发出的各种命令。
/etc/passwd
至此,终端屏幕上显示 “$”,表明 shell 已经启动完毕,等待用户的输入:
$
2、shell 的终止
当用户发出 exit 或 logout 命令时,shell 程序终止运行,该用户退出系统:
$ exit
系统将再次为该终端建立一个 getty 进程,等待用户的下一次登录。
8.2 输入输出重定向
如果一个进程在运行时需要输入输出数据,在缺省状况下是:
- 从标准输入上读入数据
- 向标准输出上输出结果
利用 shell 的重定向操作符,可以把进程的输入输出数据重新定向到任意其它文件。
8.2.0 标准输入输出
在 shell 程序中,最常使用的文件描述符 FD(file descriptor)有三个,分别是:
fd = 0 标准输入stdin:键盘
fd = 1 标准输出stdout:荧光屏
fd = 2 标准错误输出stderr:荧光屏
默认情况举例
$ cat file 运行结果(file的内容)送到标准输出荧光屏
$ passwd 所需数据(新老口令)从标准输入键盘读入
$ ls -Y abc 我们故意写了一个错误选项-Y
ls: invalid option –Y 错误信息送到标准错误输出(荧光屏)上显示
重定向举例
- 重定向不写任何数字时默认为 "1",因此 "1>" 可以省略为 ">"
- "2" 在使用时需要特别写明,不然就会被认为是 "1"
- "&>" 是 "1&2>" 的缩写,其实 "&" 可以理解为且
- "1" 是指标准输出,"&1" 是指标准输出的地址
1> &2 把标准输出重定向到标准错误
2> &1 把标准错误输出重定向到标准输出
&> filename 把标准输出和标准错误输出都重定向到文件filename中
& 是一个描述符。如果没有 "&",系统会误认为 "> 1" 后面的 "1" 是一个文件名,当找不到这个名称为 "1" 的文件时就会新建一个名称为 "1" 的文件。
8.2.1 输出重定向 >
1、语法格式
进程输出覆盖文件 filename:
command > filename
进程输出追加到文件 filename 后面,不覆盖 filename:
command >> filename
注意:> 或 >> 的前后必须保留一个空格,command 和 filename 是根据你的实际情况填写的。
例如:默认情况下使用 cat 命令,将会把文件 myfile 的内容输出到标准输出文件荧光屏上:
$ cat myfile
现在使用重定向,把文件 myfile 的内容输出到文件 newfile 中,标准输出已被重新定向到 newfile,其结果相当于拷贝文件 myfile 到文件 newfile:
$ cat myfile > newfile
或者把文件 myfile 的内容添加到文件 newfile 已有内容的后面,而不是覆盖 newfile:
$ cat myfile >> newfile
2、应用举例
① 按字母顺序显示当前系统中所有已登录的用户
依次输入以下命令,除了 $ 和汉字说明:
$ who > temp1 把当前登录用户的名单保存在temp1中
$ sort temp1 > temp2 把排序后的名单保存在temp2中
$ more temp2 逐屏显示排好序的用户名单
$ rm temp1 temp2 删除不用的临时文件
- who:查询当前登录用户的名单
- sort:输出时对文件内容进行排序,并不会改变文件内容
- more:逐屏显示文件内容,敲一下回车才会换页
- cat:直接显示文件全部内容,通过滚轮滑动查看
- rm:删除文件
② 记录长时间运行程序的日志
将运行中的信息追加到文件 run_log 中,便于随时查询:
$ system_monitor >> run_log
8.2.2 输入重定向 <
进程的输入来自文件 filename,可记忆成 command ← filename:
command < filename
例如:把输入内容——文件 ive 内容——送到标准输出荧光屏:
$ cat < ive
I have ive.
I've ive.
minive
效果等价于查看文件 ive 内容:
$ cat ive
例如:若 cat 命令后无文件名,则 cat 会等待键盘输入:
$ cat
abcde 键盘输入内容
abcde cat进程输出内容
this is a test line 键盘输入内容
this is a test line cat进程输出内容
效果就是你输入什么它输出什么。
8.2.3 常见输入输出重定向形式
8.2.4 标准错误输出重定向
进程运行中的错误信息重定向到文件 filename:
command 2> filename
注意:2 和 > 之间没有空格。
例如:在编译过程中如果出现 core.c 不存在或不能读,以及 core_prt 没有写权限等错误,则把错误信息保存在文件 err.log 中:
$ gcc -o core_prt core.c 2> err.log
把连接后的 file1 和 file2 输出到 file3 中。如果该命令在运行过程中出现错误,则把错误信息输出到文件 errfile 中:
$ cat file1 file2 > file3 2> errfile
本例中 grep 命令的标准输出被重定向到了 count_log 文件,而标准错误输出又被重定向到了标准输出,因此无论是正常输出还是错误信息都会被送到 count_log:
$ grep string6 data_sav > count_log 2> &1
事实上,“&1” 表示标准输出的地址,而不是标准输出
8.3 管道
1、语法格式
管道用于连接两个命令,它把前一个命令的标准输出重定向给后一个命令作为标准输入:
- 对 command1 来说,其标准输出被重定向到管道
- 对 command2 来说,其标准输入也被重定向到管道
❤ 管道的使用格式为:
command1 | command2
可以把前面举的例子:
$ who > temp1 把当前登录用户的名单保存在temp1中
$ sort temp1 > temp2 把排序后的名单保存在temp2中
$ more temp2 逐屏显示排好序的用户名单
$ rm temp1 temp2 删除不用的临时文件
化简为如下形式,即 who 的输出作为 sort 的输入,sort 的输出作为 more 的输入:
$ who | sort | more
这样就省去了两个中间文件。
2、应用举例
查看系统当前有几个用户在上机使用系统:
$ who | wc –l
- wc (Word Count):统计指定文件中的字节数、字数、行数,并将统计结果显示输出
- -l,--lines:统计行数
把文件 myfile 按标准打印格式处理后,送到打印机打印出来,原文件 myfile 并未作任何修改:
$ pr myfile | lp
在包含所有用户名单的文件 user_list 中,查找包含 student 的行,并把结果排序后输出到文件 stu_list 中,此例为管道和输出重定向的混合使用:
$ grep student user_list | sort > stu_list
- grep [options] [pattern] filename
- 功能:对目标文本逐行进行匹配检查,打印匹配到的行
- -i:忽略字符的大小写
- -o:仅显示匹配到的字符串本身