linux中三种标准输入输出设备
硬件设备和文件描述符:
计算机的硬件设备有很多,常见的输入设备有键盘、鼠标、麦克风、手写板等,输出设备有显示器、投影仪、打印机等。不过,在 Linux 中,标准输入设备指的是键盘,标准输出设备指的是显示器。Linux 中一切皆文件,包括标准输入设备(键盘)和标准输出设备(显示器)在内的所有计算机硬件都是文件。
为了表示和区分已经打开的文件,Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。
Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。
stdin、stdout、stderr 默认都是打开的,在重定向的过程中,0、1、2 这三个文件描述符可以直接使用。
设备文件类型 | 全拼 | 设备文件描述符 | 默认位置 |
---|---|---|---|
标准输入STDIN | standard input | 0 | 键盘 |
标准输出STDOUT | standard output | 1 | 终端(屏幕) |
标准错误STDERR | standard error | 2 | 终端(屏幕) |
STDIN是标准输入,默认从键盘读取信息;
STDOUT是标准输出,默认将输出结果输出至终端;
STDERR是标准错误,默认将输出结果输出至终端。
由于STDOUT与STDERR都会默认显示在终端上,为了区分,就有了编号的0,1,2的定义,用1表示STDOUT,2表示STDERR。
可以使用IO重定向(redirection),改变输入、输出的发送位置。
实例:
[root@localhost home]# ll /home/demo/config.properties #文件存在,标准输出显示在终端。
-rwxr-xr-x. 1 root root 568 May 24 01:03 /home/demo/config.properties
[root@localhost home]# ll /home/demo/xxx.properties #文件不存在,标准错误显示在终端。
ls: cannot access '/home/demo/xxx.properties': No such file or directory
[root@localhost home]#
重定向
参考文档:Linux Shell重定向(输入输出重定向)精讲
什么是输入输出方向呢?标准的输入输出方向又是什么呢?
一般情况下,我们都是从键盘读取用户输入的数据,然后再把数据拿到程序(C语言程序、Shell 脚本程序等)中使用;这就是标准的输入方向,也就是从键盘到程序。反过来说,程序中也会产生数据,这些数据一般都是直接呈现到显示器上,这就是标准的输出方向,也就是从程序到显示器。
输入输出方向就是数据的流动方向:
- 输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。
- 输出方向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。
输出重定向
输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。 |
对于输入重定向来讲,用到的符号及其作用:
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
对于输出重定向来讲,用到的符号及其作用:
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
[root@localhost home]# find /etc/ -name passwd 1>/tmp/test1.txt #把代号为1的标准输出信息重定向到/tmp/test1.txt里面
[root@localhost home]# cat /tmp/test1.txt
/etc/pam.d/passwd
/etc/passwd
[root@localhost home]#
输出重定向的完整写法其实是fd>file
或者fd>>file
,其中 fd 表示文件描述符,如果不写,默认为 1,也就是标准输出文件。
当文件描述符为 1 时,一般都省略不写,如上表所示;当然,如果你愿意,也可以将command >file写作command 1>file,但这样做是多此一举。
当文件描述符为大于 1 的值时,比如 2,就必须写上。
需要重点说明的是,fd和>之间不能有空格,否则 Shell 会解析失败;>和file之间的空格可有可无。
所有信息都重定向的一个文件的方法是find /etc/ -name passwd &> tmp/test012.txt