文章目录
1 标准输入、输出、错误
我们运行的许多程序,都会产生某种输出,这些输出由两种类型组成:
- 程序运行结果
程序要完成的功能,可能会产生某些输出 - 状态和错误信息
程序运行的状态和错误信息,让我们指导程序运行的进展。
正如Unix主题“任何东西都是一个文件”一样。程序实际上把运行结果输送到一个叫标准输出的特殊文件(stdout);把状态信息输送到一个叫标准错误的文件(stderr)。默认情况下,标准输入和标准输出都连接到屏幕上。另外,许多程序从一个叫标准输入(stdin)的设备获取输入,默认情况下,标准输入连接到键盘。
2 I/O重定向
I/O重定向允许我们修改输出地点和输入来源。
2.1 标准输出重定向
标准输出重定向的方式:
- 使用
>
重定向符 - 使用
>>
重定向符
2.1.1 >
重定向符的使用
按照格式command > output.file
使用>
重定向符,可以将命令command
的标准输出重定向到指定的文件output.file
。
- 使用
>
重定向符时,如果指定的文件已经存在,会清空文件内容;否则创建一个新的空文件。然后将运行结果写入文件。这个特性可以用于方便我们情况文件内容
比如> output.file
(重定向符前面没有任何命令),这就会清除output.file
文件中的内容。
示例:
- 默认情况下,
ll
命令将结果输出到屏幕[root@chinehe test]# ll / total 64 lrwxrwxrwx. 1 root root 7 Sep 19 2023 bin -> usr/bin #(为了避免博客过长,这里删除了部分输出~) drwxr-xr-x. 19 root root 4096 Sep 19 2023 var
- 使用
>
重定向符,将标准输出连接到指定ll.root.out
[root@chinehe test]# ll / > ll.root.out
- 查看
ll.root.out
[root@chinehe test]# ll total 4 -rw-r--r-- 1 root root 1087 Nov 12 10:24 ll.root.out [root@chinehe test]# cat ll.root.out total 64 lrwxrwxrwx. 1 root root 7 Sep 19 2023 bin -> usr/bin #(为了避免博客过长,这里删除了部分输出~) drwxr-xr-x. 19 root root 4096 Sep 19 2023 var [root@chinehe test]#
2.1.2 >>
重定向符的使用
按照格式command >> output.file
使用>>
重定向符,可以将命令command
的标准输出重定向到指定的文件output.file
。
- 使用
>>
重定向符时,如果指定的文件已经存在,会将运行结果添加到文件内容后面;否则创建一个新的空文件,然后将运行结果写入文件。注意
>
与>>
两个重定向符的区别 ~
示例:
- 默认情况下,
ll
命令将结果输出到屏幕[root@chinehe test]# ll / total 64 lrwxrwxrwx. 1 root root 7 Sep 19 2023 bin -> usr/bin #(为了避免博客过长,这里删除了部分输出~) drwxr-xr-x. 19 root root 4096 Sep 19 2023 var
- 使用
>>
重定向符,将标准输出连接到指定ll.root.out
[root@chinehe test]# ll / >> ll.root.out
- 查看
ll.root.out
,会发现新创建了一个ll.root.out
文件,其内容为命令的输出。[root@chinehe test]# ll total 4 -rw-r--r-- 1 root root 1087 Nov 12 10:24 ll.root.out [root@chinehe test]# cat ll.root.out total 64 lrwxrwxrwx. 1 root root 7 Sep 19 2023 bin -> usr/bin #(为了避免博客过长,这里删除了部分输出~) drwxr-xr-x. 19 root root 4096 Sep 19 2023 var [root@chinehe test]#
- 再来一次,使用
>>
重定向符,将标准输出连接到指定ll.root.out
[root@chinehe test]# ll / >> ll.root.out
- 再看看现在的
ll.root.out
,会发现文件中有两次执行的输出。(读者可以试试>
,它就不会)[root@chinehe test]# cat ll.root.out total 64 lrwxrwxrwx. 1 root root 7 Sep 19 2023 bin -> usr/bin #(为了避免博客过长,这里删除了部分输出~) drwxr-xr-x. 19 root root 4096 Sep 19 2023 var total 64 lrwxrwxrwx. 1 root root 7 Sep 19 2023 bin -> usr/bin #(为了避免博客过长,这里删除了部分输出~) drwxr-xr-x. 19 root root 4096 Sep 19 2023 var
2.2 标准错误重定向
2.2.1 文件描述符重定向
标准错误重定向并没有专用的重定向操作符。为了重定向标准错误,我们需要参考文件描述符:
一个程序可以在几个编号的文件流中的任一个上产生输出。虽然我们已经将这些文件流的前三个称作标准输入、标准输出、标准错误,shell内部分别将其称为文件描述符0、1、2.
shell使用文件描述符提供了一个表示法来重定向文件:
#格式
{命令} {文件描述符}{重定向符}{目标文件}
# 示例
ll /bin/users 1> ll.1.log # 重定向命令标准输出(文件覆盖)
ll /bin/users 1>> ll.1.log # 重定向命令标准输出(文件追加)
ll /bin/users 2> ll.2.log # 重定向命令标准错误(文件覆盖)
ll /bin/users 2>> ll.2.log # 重定向命令标准错误(文件追加)
2.2.2 重定向标准输出&错误到一个文件
某些场景下,我们希望将命令的所有输出(标准输出&错误)都写到同一个文件中,这时我们必须同时重定向标准输出和标准错误。
有两种方式实现:
- 传统的方法(旧版本中也有效):在重定向标准输出后,使用
2>&1
将标准错误重定向到标准输出ll /bin/users 1> ll.1.log 2>&1
- 第二个方法(新版本中有效):现在的版本中,可以使用
&>
来实现重定向标准输出和标准错误到指定的文件ll /bin/users &> ll.1.log
2.3 处理不需要的输出
有时候,我们并不想要一个程序的输出结果,只想“沉默是金”。这时我们可以将其重定向到一个叫/dev/null
的特殊文件。
ll /bin/users &> /dev/null
/dev/null
文件是系统设备,叫做位存储桶,它可以接受输入,但不对输入做任何处理。
2.4 标准输入重定向
使用<
重定向操作符,可以将标准输入重定向到指定的文件。
比如,当我们使用cat
命令且不指定文件时,标准输入就是键盘,命令会将我们键盘输入的值输出到标准输出。
示例:
# 输出重定向到cat.log
[root@chinehe ~]# cat > cat.log
# 键盘输入
Hello
World
I
Am
Cat
# Ctrl+C结束
^C
# 查看日志文件
[root@chinehe ~]# cat cat.log
Hello
World
I
Am
Cat
我们可以使用<
重定向操作符,将标准输入重定向到cat.log文件,标准输出到屏幕。
[root@chinehe ~]# cat < cat.log
Hello
World
I
Am
Cat
当然这里只是为了讲解如何重定向标准输入,上述的命令效果和cat cat.log
并没有什么区别。
3 管道
使用管道操作符|
可以将一个命令的标准输出通过管道送至另一个命令的标准输入。
格式:
{command_1} | {command_2} | {command_3}
# 将命令1的标准输出,作为命令2的标准输入;
# 将命令2的标准输出,作物命令3的标准输入。
示例:
ll /bin/ | grep z | less
ll /bin/
查看/bin目录下的所有内容grep z
在ll /bin/
的输出中筛选出包含z
的项目less
用于查看grep z
的输出