数据流与重定向
数据流与重定向
一、数据流
- 标准输入(standard input,简称stdin):默认情况下,标准输入指从键盘获取的输入
- 标准输出(standard output,简称stdout):默认情况下,命令执行所回传正确的信息会输出到屏幕上
- 标准错误输出(standard error output,简称stderr):默认情况下,标准错误输出可理解为命令执行失败后,所回传的错误信息会输出到屏幕上不管正确或错误的数据都是默认输出到屏幕上,所以屏幕是混乱的。所以就需要用数据流重定向将这两条数据分开。数据流重定向可以将标准输出和标准错误输出分别传送到其他的文件或设备去,而分别传送所用的特殊字符如下所示:
- 标准输入(stdin):代码为0
- 标准输出(stdout):代码为1
- 标准错误输出(stderr):代码为2
二、重定向
概念
重定向操作符可以将命令输入和输出数据流从默认设备重定向到其他位置。
重定向操作符本身不是命令,而是命令中附加的可改变命令的输入和输出对象的特殊符号。
符号
输出重定向操作符: > >>
输入重定向操作符: < <<
1.输出重定向和追加
-
用法
输出重定向 > 追加 >>命令 >文件 或 命令 1>文件 : 将命令执行后的结果不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件 命令 2>文件 : 将命令执行后所产生的错误信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件 命令 2>/dev/null : 将命令执行后所产生的错误信息不在默认的屏幕上显示,而是写入到空设备文件(黑洞)中,即将输出的错误信息丢弃掉 命令 &>文件 命令 >&文件 : 将命令执行后的正确输出信息和错误信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件 命令 >>文件 : 将命令执行后的正确输出信息以追加的方式写入到指定的文件中,不覆盖原文件内容,若指定的文件不存在,则自动创建该文件
-
例(在普通用户下):
-
输出重定向(覆盖)
find /etc/ -name passwd > a.txt
-
输出重定向(追加)
find /etc/ -name passwd >> a.txt
-
错误信息输出重定向(覆盖)
find /etc/ -name passwd 2> a.err
-
全部信息输出重定向
find /etc/ -name passwd &> a.txt
-
重定向到空设备(/dev/null)
find /etc/ -name passwd 2> /dev/null
-
2.输入重定向和多行录入
-
用法
命令 <文件 : 使命令从指定的文件中读取数据作为输入 命令 <<结束标识字符串 : 在命令行读取数据作为输入,直到遇到指定的结束标识字符串
-
例:
-
从文件读取数据作为cat命令的输入
# 将timedatectl命令输出到a.txt文件中 [root@localhost Desktop]# timedatectl > a.txt # 查看a.txt内容 [root@localhost Desktop]# cat a.txtLocal time: Fri 2024-10-25 11:48:13 CSTUniversal time: Fri 2024-10-25 03:48:13 UTCRTC time: Fri 2024-10-25 03:36:59Time zone: Asia/Shanghai (CST, +0800) System clock synchronized: noNTP service: inactiveRTC in local TZ: no# 从文件a.txt读取数据作为cat命令的输入 [root@localhost Desktop]# cat < a.txtLocal time: Fri 2024-10-25 11:48:13 CSTUniversal time: Fri 2024-10-25 03:48:13 UTCRTC time: Fri 2024-10-25 03:36:59Time zone: Asia/Shanghai (CST, +0800) System clock synchronized: noNTP service: inactiveRTC in local TZ: no [root@localhost Desktop]#
-
标准输入重定向 << 并不表示追加,而是表示输入结束的意思,即作为一个结束符。
# EOF 是分隔符,可以是任何字符 [root@localhost Desktop]# cat > b.txt << EOF > hello > hello > hello > hello > hello > EOF [root@localhost Desktop]# cat b.txt hello hello hello hello hello [root@localhost Desktop]#[root@localhost Desktop]# tr 'a-z' 'A-Z' < b.txt HELLO HELLO HELLO HELLO HELLO [root@localhost Desktop]#
-