17.Linux Shell输入输出流管理

本文详细介绍了LinuxShell中的输入输出流管理,包括标准文件描述符、脚本中重定向输出的临时和永久方法、自定义输出重定向、输入重定向、支持读写的文件描述符、关闭文件描述符以及输出同时发送到显示器和日志文件的技术。此外,还提到了lsof和tee命令的使用,以及如何管理脚本的日志输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


Linux Shell输入输出流管理

目前对于普通用户来说,接触到最多的Linux Shell输出的方法有两个,一个是显示到显示器上,一个是将输出重定向到文件中。不过,目前的方式,只能二选一,要么将shell全部输出到显示器上,要么将shell输出全部保存到文件中,如果想将一部分输出到显示上一部分记录到文件中,那么该如何实现呢?如何用标准的Linux输入和输出系统来将脚本输出导向特定位置呢?

1)标准文件描述符

Linux系统将每个对象当作文件处理。Linux用文件描述符来标识每个文件对象。文件描述符是一个非负整数,可以唯一标识会话中打开的文件。每个进程一次最多可以有九个文件描述符。出于特殊目的,bash shell保留了前三个文件描述符(0, 1, 2)。这三个特殊文件描述符作为标准的文件描述符会处理脚本的输入和输出。

文件描述符 缩写 描述
0 STDIN 标准输入
1 STDOUT 标准输出
2 STDERR 标准错误

STDIN文件描述符代表shell的标准输入。对终端界面来说,标准输入是键盘。shellSTDIN文件描述符对应的键盘获得输入,在用户输入时处理每个字符。

许多bash命令能接受 STDIN 的输入,尤其是没有在命令行上指定文件的话。

当在命令行上只输入 cat 命令时,它会从 STDIN 接受输入。输入一行, cat 命令就会显示出一行。

$ cat
this is a line
this is a line

在使用输入重定向符号( < )时,Linux会用重定向指定的文件来替换标准输入文件描述符。它会读取文件并提取数据,就如同它是键盘上键入的。

可以通过 STDIN 重定向符号强制 cat 命令接受来自另一个非 STDIN 文件的输入:

cat < file
this is a line

**STDOUT文件描述符代表shell的标准输出。**在终端界面上,标准输出就是终端显示器。shell的所有输出(包括shell中运行的程序和脚本)会被定向到标准输出中,也就是显示器。

通过输出重定向符号,通常会显示到显示器的所有输出会被shell重定向到指定的重定向文件。

$ ls -alh > test.log
# cat test.log
# 总用量 12K
# drwxrwxr-x 2 rob rob 4.0K 1月   5 23:28 .
# drwxr-xr-x 6 rob rob 4.0K 1月   5 23:28 ..
# -rw-rw-r-- 1 rob rob    3 1月   5 23:28 1.txt
# -rw-rw-r-- 1 rob rob    0 1月   5 23:28 test.log

也可以用>>符号将数据追加到某个文件

$ who >> test.log
# cat test.log
# 总用量 12K
# drwxrwxr-x 2 rob rob 4.0K 1月   5 23:28 .
# drwxr-xr-x 6 rob rob 4.0K 1月   5 23:28 ..
# -rw-rw-r-- 1 rob rob    3 1月   5 23:28 1.txt
# -rw-rw-r-- 1 rob rob    0 1月   5 23:28 test.log
# lx       :1           2024-01-02 21:11 (:1)

当命令生成错误消息时,shell并不能将错误消息重定向到输出重定向文件

$ ls -alh rob > test.log
# ls: 无法访问 'rob': 没有那个文件或目录

test.log文件创建成功了,只是里面是空的。shell对于错误消息的处理是跟普通输出分开的。

STDERR文件描述符用来处理错误消息STDERR文件描述符代表shell的标准错误输出。shellshell中运行的程序和脚本出错时生成的错误消息都会发送到这个位置。

尽管分配给它们的文件描述符值不同,默认情况下, STDERR 文件描述符会和 STDOUT 文件描述符指向同样的地方,譬如显示器,但STDERR 并不会随着 STDOUT 的重定向而发生改变。

要重定向错误输出,只需要在使用重定向符号时定义 STDERR 文件描述符就可以了STDERR 文件描述符被设成 2,可以选择只重定向错误消息。

$ ls -al rob 2> test.log
cat test.log 
# ls: 无法访问 'rob': 没有那个文件或目录

用这种方法,shell会只重定向错误消息,正常 STDOUT 输出仍然会发送到默认的 STDOUT 文件描述符,也就是显示器。

要同时重定向错误和正常输出,必须用两个重定向符号

$ ls -al rob  test.log 2> test.log 1>out.log
cat test.log 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值