DJ8-1 shell 的启动和终止、重定向、管道

目录

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:仅显示匹配到的字符串本身

猜你喜欢

转载自blog.csdn.net/m0_64140451/article/details/130797044