Linux呈现数据

2024-05-10 06:36
文章标签 数据 linux 呈现

本文主要是介绍Linux呈现数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、理解输入和输出

1.1 标准文件描述符

 1.1.1 STDIN

 1.1.2 STDOUT

1.1.3 STDERR

1.2 重定向错误

二、在脚本中重定向输出

2.1 临时重定向

2.2 永久重定向 

三、在脚本中重定向输入

四、创建自己的重定向

4.1 创建输出文件描述符 

 4.2 重定向文件描述符

4.3 关闭文件描述符 


一、理解输入和输出

1.1 标准文件描述符

Linux系统会将每个对象作为文件来处理,这包括输入和输出。Linxu用文件描述符来标识每个文件对象。文件描述符是一个非负整数,每个进程一次最多可以打开9个文件描述符。出于特殊目的,bash shell保留了前3个文件描述符(0、1和2)

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

 1.1.1 STDIN

STDIN文件描述符代表shell的标准输入。对终端界面来说,标准输入是键盘。在使用输入重定向符(<)时,Linux会用重定向指定的文件替换标准输入文件描述符(即0),命令就会从文件中读取数据,就像从键盘中输入的一样

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat < testfile
hello world
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 1.1.2 STDOUT

STDOUT文件描述符代表shell的标准输出。在终端界面上,标准输出就是终端显示器。在默认情况下,大多数bash命令会将输出送往STDOUT文件描述符。可以用输出重定向来更改此设置。

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ls > test_stdout.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test_stdout.txt
script
testfile
test_stdout.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

1.1.3 STDERR

在默认情况下,STDOUT和STDERR指向同一个地方(尽管二者的文件描述符索引值不同) ,也就是说都会显示在屏幕上。STDERR并不会随着STDOUT的重定向发生改变,STDERR文件描述符是2。

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ls bb.txt
ls: cannot access bb.txt: No such file or directory
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ls bb.txt 2> test_stderr.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test_stderr.txt
ls: cannot access bb.txt: No such file or directory
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

1.2 重定向错误

如果想重定向错误信息和正常输出,则必须指定两个重定向符号

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ls script bbfile
ls: cannot access bbfile: No such file or directory
script:
aa.exp
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ls script bbfile 2> test1 1> test2
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat  test1
ls: cannot access bbfile: No such file or directory
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test2
script:
aa.exp
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 上例中,ls命令的正常输出本该送往STDOUT,shell使用 1> 将其重定向到了文件test2,而本该送往STDERR的错误信息则通过 2> 被重定向到了文件test1中。

另外你还可以将STDOUT和STDERR的输出重定向到同一个文件,重定向符 &>

二、在脚本中重定向输出

2.1 临时重定向

如果你有意在脚本中生成错误信息,可以将单独的一行重定向到STDERR。这只需要使用输出重定向符号将输出重定向到STDERR 文件描述符。在重定向到文件描述符时,必须在文件描述索引值之前加一个&

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test8
#! /bin/bashecho "This is an error" >&2
echo "This is normal output"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test8
This is an error
This is normal output
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

如果单独运行脚本看不出任何区别,因为,默认情况下,STDOUT和STDERR指向的位置是一样的。但是如果在运行脚本时重定向了STDERR,那么脚本中所有送往STDERR的文本就会被重定向 

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test8 2> test9
This is normal output
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test9
This is an error
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

2.2 永久重定向 

如果脚本中有大量数据需要重定向,那么逐条重定向就会很麻烦,这时可以用 exec 命令,它会告诉shell在脚本执行期间重定向某个特定文件描述符:

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test10
#! /bin/bashexec 1>testoutecho "nihao"
echo "zhongguo"
echo "hahah"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test10
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat testout
nihao
zhongguo
hahah
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 exec会启动一个新的shell并将STDOUT文件描述符重定向到指定文件。脚本中送往STDOUT的所有输出都会被重定向。

也可以在脚本执行过程中重定向STDERR

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test11
#! /bin/bashexec 2>testerrecho "这是标准输出1"
echo "这是标准输出2"
echo "这是标准输出3"exec 1>testoutecho "这里的输出将会重定向到指定文件"
echo "这行将会重定向到标准错误" >&2
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test11
这是标准输出1
这是标准输出2
这是标准输出3
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat testout
这里的输出将会重定向到指定文件
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat testerr
这行将会重定向到标准错误
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

该脚本使用 exec 命令 将送往STDERR的输出重定向到了文件testerr。接下来,脚本用echo语句向STDOUT显示了几行文本。随后再次使用 exec 将STDOUT重定向到文件testout。注意,尽管STDOUT被重定向了。然然可以将echo语句的输出发送给STDERR,本例中仍是被重定向到了testerr文件。

一旦重定向了STDOUT或STDERR,就不太容易将其恢复到原来的位置,如果需要再重定向中来回切换,那么就要用到后面介绍的创建自己的重定向

三、在脚本中重定向输入

相同的方法,可以使用重定向将STDIN从键盘重定向到其他位置。在Linux系统中允许将STDIN重定向为文件:

exec 0< testfile

 该命令会告诉shell,他应该从文件testfile中而不是键盘上获取输入。

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat testfile
this is the first line
this is the second line
this is the third line
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test12
#! /bin/bashexec 0< testfilecount=1while read line
doecho "Line #$count: $line"count=$[ $count + 1 ]
done
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test12
Line #1: this is the first line
Line #2: this is the second line
Line #3: this is the third line
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 将STDIN重定向为文件后,当read命令试图冲STDIN读入数据时,就会到文件而不是键盘上检索数据。

这是一种在脚本中从待处理的文件中读取数据的绝妙技术。Linux管理员的日常任务之一就是从日志文件中读取并处理数据,这是完成该任务的最简单的办法。

四、创建自己的重定向

在脚本中重定向输入和输出时,并不局限于这3个默认的文件描述符。在shell中最多可以打开9个文件描述符。替代性文件描述符从3到8共6个,均可以用作输入或输出重定向。 

4.1 创建输出文件描述符 

可以用 exec  命令用于分配输出的文件描述符。和标准文件描述符一样,一旦将替代性文件描述符指向文件,此定向就会一直有效,直至重新分配。

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test13
#! /bin/bashexec 3> test13outecho "输出到显示器"
echo "输出到指定文件" >&3
echo "也是输出到屏幕"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test13
输出到显示器
也是输出到屏幕
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test13out
输出到指定文件
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 4.2 重定向文件描述符

有一个技巧能帮助你恢复到已重定向的文件描述符。你可以将另一个文件描述符分配给标准文件描述符,反之亦可。这意味着可以将STDOUT的原先位置重定向到另一个文件描述符,然后再利用该文件描述符恢复STDOUT。

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test14
#! /bin/bashexec 3>&1
exec 1> test14outecho "改行内容将会重定向到test14out中"exec 1>&3echo "这行内容将正常显示在屏幕上"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test14
这行内容将正常显示在屏幕上
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test14out
改行内容将会重定向到test14out中
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 该脚本中,第一个 exec 命令将文件描述符3重定向到文件描述符1(STDOUT)的当前位置,也就是显示器。

第二个 exec 命令将STDOUT重定向到了文件。但是,文件描述符 3 扔指向显示器。如果此时将输出数据发送给文件描述符 3 ,他仍然会显示在屏幕上,即使STDOUT已经被重定向了。

向STDOUT(现在指向一个文件)发送一些输出之后,第三个 exec 命令将STDOUT重定向了文件描述符 3 的当前位置(现在仍然是显示器)。这意味着现在STDOUT又恢复如初了。

4.3 关闭文件描述符 

如果创建了新的输入文件描述符或输出文件描述符,那么shell会在脚本退出时自动将其关闭。然而在一些情况下,需要在脚本结束前手动关闭文件描述符。

要关闭文件描述符,只需将其重定向到特殊符号 &- 即可

exec 3>&-

这篇关于Linux呈现数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975704

相关文章

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程