linux shell数据重定向(输入重定向与输出重定向)详细分析

2023-11-16

在了解重定向之前,我们先来看看linux 的文件描述符。

linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值。

 

linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2

以后打开文件后。新增文件绑定描述符 可以依次增加。 一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个文件描述符。

 

对于任何一条linux 命令执行,它会是这样一个过程:

image

一个命令执行了:

先有一个输入:输入可以从键盘,也可以从文件得到

命令执行完成:成功了,会把成功结果输出到屏幕:standard output默认是屏幕

命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕

 

文件输入输出由追踪为一个给定的进程所有打开文件的整数句柄来完成。这些数字值就是文件描述符。最为人们所知的文件米描述符是 stdin, stdoutstderr,文件描述符的数字分别是0,1和2。这些数字和各自的设备是保留的。一个命令执行前,先会准备好所有输入输出,默认分别绑定(stdin,stdout,stderr),如果这个时候出现错误,命令将终止,不会执行。命令解析过程,可以参考:Linux Shell 通配符、元字符、转义符使用实例介绍

 

这些默认的输出,输入都是linux系统内定的,我们在使用过程中,有时候并不希望执行结果输出到屏幕。我想输出到文件或其它设备。这个时候我们就需要进行输出重定向了。

 

linux shell下常用输入输出操作符是:

1.  标准输入   (stdin) :代码为 0 ,使用 < 或 << ; /dev/stdin -> /proc/self/fd/0   0代表:/dev/stdin
2.  标准输出   (stdout):代码为 1 ,使用 > 或 >> ; /dev/stdout -> /proc/self/fd/1  1代表:/dev/stdout
3.  标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr

 

  • 输出重定向:

格式:

command-line1 [1-n] > file或文件操作符或设备

上面命令意思是:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)  重定向其它输出设备(文件,打开文件操作符,或打印机等等)1,2分别是标准输出,错误输出。

实例:

#显示当前目录文件 test.sh test1.sh test1.sh实际不存在
[chengmo@centos5 shell]$ ls test.sh test1.sh
ls: test1.sh: 没有这个文件和目录
test.sh

#正确输出与错误输出都显示在屏幕了,现在需要把正确输出写入suc.txt
# 1>可以省略,不写,默认所至标准输出
[chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt
ls: test1.sh: 没有这个文件和目录
[chengmo@centos5 shell]$ cat suc.txt 
test.sh

#把错误输出,不输出到屏幕,输出到err.txt
[chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt 2>err.txt
[chengmo@centos5 shell]$ cat suc.txt err.txt 
test.sh
ls: test1.sh: 没有这个文件和目录
#继续追加把输出写入suc.txt err.txt  “>>”追加操作符
[chengmo@centos5 shell]$ ls test.sh test1.sh 1>>suc.txt 2>>err.txt 

#将错误输出信息关闭掉
[chengmo@centos5 shell]$ ls test.sh test1.sh 2>&-
test.sh
[chengmo@centos5 shell]$ ls test.sh test1.sh 2>/dev/null
test.sh
#&[n] 代表是已经存在的文件描述符,&1 代表输出 &2代表错误输出 &-代表关闭与它绑定的描述符
#/dev/null 这个设备,是linux 中黑洞设备,什么信息只要输出给这个设备,都会给吃掉 

#关闭所有输出
[chengmo@centos5 shell]$ ls test.sh test1.sh  1>&- 2>&- 
#关闭 1 ,2 文件描述符
[chengmo@centos5 shell]$ ls test.sh test1.sh  2>/dev/null 1>/dev/null
#将1,2 输出转发给/dev/null设备 
[chengmo@centos5 shell]$ ls test.sh test1.sh >/dev/null 2>&1
#将错误输出2 绑定给 正确输出 1,然后将 正确输出 发送给 /dev/null设备  这种常用

[chengmo@centos5 shell]$ ls test.sh test1.sh &>/dev/null #& 代表标准输出 ,错误输出 将所有标准输出与错误输出 输入到/dev/null文件

 

 

注意:

1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。

2、“>>”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)或错误输出(2) 绑定。

3、当命令:执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。

4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。

5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行

  • 输入重定向

格式:

command-line [n] <file或文件描述符&设备

将然有,命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入。执行这个命令,将标准输入0,与文件或设备绑定。将由它进行输入。

实例:

[chengmo@centos5 shell]# cat > catfile 
testing 
cat file test 
#这里按下 [ctrl]+d 离开 
#从标准输入【键盘】获得数据,然后输出给catfile文件

[chengmo@centos5 shell]$ cat>catfile <test.sh
#cat 从test.sh 获得输入数据,然后输出给文件catfile


[chengmo@centos5 shell]$ cat>catfile <<eof
test a file
test!
eof

#<< 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,输入自动结束,不用ctrl+D


 

 

  • exec绑定重定向

格式:

exec 文件描述符[n] <或> file或文件描述符或设备

在上面讲的输入,输出重定向 将输入,输出绑定文件或设备后。只对当前那条指令是有效的。如果需要在绑定之后,接下来的所有命令都支持的话。就需要用exec命令

实例:

[chengmo@centos5 shell]$ exec 6>&1
#将标准输出与fd 6绑定

[chengmo@centos5 shell]$ ls  /proc/self/fd/  
0  1  2  3  6
#出现文件描述符6

[chengmo@centos5 shell]$ exec 1>suc.txt
#将接下来所有命令标准输出,绑定到suc.txt文件(输出到该文件)

[chengmo@centos5 shell]$ ls -al
#执行命令,发现什么都不返回了,因为标准输出已经输出到suc.txt文件了

[chengmo@centos5 shell]$ exec 1>&6
#恢复标准输出


[chengmo@centos5 shell]$ exec 6>&-
#关闭fd 6描述符

[chengmo@centos5 ~]$ ls /proc/self/fd/
0  1  2  3


说明:使用前先将标准输入保存到文件描述符6,这里说明下,文件描述符默认会打开0,1,2 还可以使用自定义描述符 。然后对标准输出绑定到文件,接下来所有输出都会发生到文件。 使用完后,恢复标准的输出,关闭打开文件描述符6。

有趣事情:

可能有朋友会这样用:exec 1>suc.txt ,接下来所有输出都绑定到suc.txt 文件,那么怎么样恢复原来的呢? 试试你就会发现问题所在……

  • 复杂一点实例
 exec 3<>test.sh;
 #打开test.sh可读写操作,与文件描述符3绑定
 
 while read line<&3
  do
     echo $line;
 done
 #循环读取文件描述符3(读取的是test.sh内容)
 exec 3>&-
 exec 3<&-
 #关闭文件的,输入,输出绑定
 

 

  • 总结下:

学习就要总结,总结才可以提高了。哈哈!

估计还有一些朋友是头晕晕的。怎么linux的重定向这么复杂呢,又是文件打开描述符又是读,还有些,还有默认标准输入输出。

其实,总结一下,重定向应用通常就以下两点:

1、重新设置命令的默认输入,输出,指向到自己文件(文件,文件描述符,设备其实都是文件,因为linux就是基于设备也是文件,描述符也指向是文件,哈哈)

2、扩展自己新的描述符,对文件进行读写操作

转载于:https://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux shell数据重定向(输入重定向与输出重定向)详细分析 的相关文章

  • 选择多个模式的 awk 代码

    这是我的输入文件 比如modified txt r4544 n479826 2012 08 28 07 12 33 0400 Tue 28 Aug 2012 1 line Changed paths M branches 8 6 0 con
  • 如何从正则表达式中获取所有匹配项?

    我想获得所有出现的情况 0 9A Z 以供稍后处理 我有 if cat file 0 9A Z then echo BASH REMATCH fi 这给了我第一个匹配项 但是我如何处理文件中的所有匹配项 谢谢 如果您只想获取正则表达式的匹配
  • 有没有办法改变vim的默认模式

    有谁知道如何更改vim的默认模式 它的默认模式是命令模式 但是我可以将其更改为插入模式吗 只需将以下行添加到您的 vimrc 中 start Vim s default mode will be changed to Insert mode
  • bash 脚本中的未绑定变量

    在调试我的脚本时 我变得绝望 我使用了我的高级同事向我推荐的一些结构 但我不知道如何使其正常工作 bin bash x set ueo pipefail exec gt tmp dq log source BASH SOURCE env p
  • 从配置文件中读取分配

    我有配置文件 其中每行都包含用分号分隔的分配 像这样的东西 模仿正常的 shell 分配 VAR1 1 VAR2 2 VAR1 3 VAR2 4 每行包含相同的变量 并且旨在单独处理 这些配置文件都在系统管理员的控制之下 所以使用eval现
  • 终端从包含空格的变量传递参数

    在终端中如何将包含空格的字符串作为参数传递 它实际上跳过了空格后面的部分 只取第一个单词 word soccer ball shell exec casperjs test js word word 那么我怎样才能转义空白它只运行这个命令
  • 为什么 ls -l 中的“总计”加起来不等于列出的总文件大小? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为什么是total在输出中ls l打印为64并不是26078列出的所有文件的总数是多少 ls l test ls total 64 rw
  • 使用终端(或 Shell)将文件的一部分复制/粘贴到另一个文件中

    我正在尝试将 txt 文件的一部分从行号 n 复制到行号 n y 假设 1000 到 1000000 我尝试过与运营商合作sed 并且失败了 这是我尝试过的命令 sed n 1000 1000000p path first file gt
  • 从 Jenkins Pipeline 捕获 shell 脚本输出

    我正在尝试提取 git 分支并在 Jenkinsfile 中提交信息 如下所示 def commit sh returnStdout true script git rev parse HEAD trim def branch sh ret
  • 编写健壮的 shell 脚本有哪些规则?

    I recently erased part of my home directory with a shell script I wrote Fortunately I did hit Ctrl C fast enough to avoi
  • 在 bash 脚本中设置变量[重复]

    这个问题在这里已经有答案了 test sh 包含 A 1 B 2 我将 test sh 设置为 chmod 777 我用两个参数启动脚本 test sh first last 然后我通过输入以下内容对其进行了测试 echo FirstVar
  • 相当于 Python 中的 set -o pipelinefail 吗?

    我有一些 Python 脚本 每个脚本都大量使用排序 uniq ing 计数 gzipping 和gunzipping 以及 awking 第一次运行我使用的代码subprocess call 是的 我知道安全风险 这就是为什么我说这是第一
  • 如何在shell脚本中读取单个字符

    我想要类似的选项getche 如何从命令行读取单个字符输入 Using read命令我们可以做到吗 在巴什中 read可以做到 read n1 ans
  • Perforce:从命令行“从工作区中删除”?

    The p4v Perforce GUI 客户端 http www perforce com perforce products p4v html具有 操作 gt 从工作空间中删除 菜单命令 该命令可从工作空间中删除受版本控制且未打开进行编
  • 拼写检查 shell 脚本

    我有一些疑问 我对一个应该是简单拼写检查器的脚本有疑问 它的目的是 当发现错误的单词时 它会提示用户输入该单词的正确拼写 如果用户输入正确的拼写 则会显示更正的单词以及错误的单词 下面 在读完所有单词之后 但是 如果用户只是按 Enter
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • unix 下日期字段排序

    我有包含数十万条记录的文本文件 其中一个字段是日期字段 有没有办法根据日期字段对文件进行排序 09 APR 12 04 08 43 632279000 AM 19 MAR 12 03 53 38 189606000 PM 19 MAR 12
  • 在压缩存档内的文本文件上运行“head”,而不解压存档

    问候 我接手了之前的团队并编写了处理 csv 文件的 ETL 作业 我在 ubuntu 上结合使用 shell 脚本和 perl csv 文件很大 它们以压缩档案形式到达 解压后 很多都超过 30Gb 是的 那是 G 旧进程是在 cron
  • shell中如何分割字符串

    我有一个变量作为 string ABC400p2q4 我怎样才能分开ABC400 and p2q4 我需要将它分成两个变量 结果我得到 echo var1 ABC400 echo var2 p2q4 可以用任何字母字符代替 ABC 可以用任

随机推荐

  • IDEA中将maven项目导出打包成war包

    点击File gt Project Structure gt Artifacts gt add 号 gt Web Application Archive gt For yourProjectName 在这里选择你要导出的war包存放的路径
  • flex布局中的align-content属性

    align content属性起作用的条件 对父元素设置自由盒属性display flex 并且设置排列方式为横向排列flex direction row 默认值 设置换行 flex wrap wrap Demo代码
  • 程序员技术练级攻略

    原文地址 http coolshell cn articles 4990 html 月光博客6月12日发表了 写给新手程序员的一封信 翻译自 An open letter to those who want to start program
  • 十四、pwm输出实验

    一 pwm的概述 1 pwm的工作原理 图中 假定定时器工作在向上计数 PWM 模式 且当 CNT
  • 论文阅读:BotFinder: A Novel Framework for Social Bots Detection in Online Social Networks Based

    目录 摘要 1 Introduction 3 Our Proposed Method BotFinder 3 1 Overview 3 2 Step1 Feature Engineering 3 3 Step2 Similarity Cal
  • 域名如何部署到正在使用的服务器

    阿里云申请的域名 PHP环境 宝塔工具 一 登录阿里云 对该域名进行解析 二 登录宝塔 添加站点 添加成功后 在改站点下上传你已经做好的页面即可 如果需要FTP操作的 就创建FTP账号密码 创建成功后 直接用FTP账号密码登录即可
  • FaceShifter:新的人脸交换模型

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 如今 深度学习已近在图像合成 图像处理领域中取得惊人的成果 FaceShifter 1 便是其中之一 它是一种深度学习模型 可以非常先进的技术实现人脸交换 在本文中 我们
  • 【2022年高教杯数学建模】C题:古代玻璃制品的成分分析与鉴别方案及代码实现(一)

    1 问题1 对这些玻璃文物的表面风化与其玻璃类型 纹饰和颜色的关系进行分析 结合玻璃的类型 分析文物样品表面有无风化化学成分含量的统计规律 并根据风化点检测数据 预测风化前的化学成分含量 2 问题1的分析 首先需要对玻璃表面风化情况与玻璃类
  • 数据库应用:CentOS 7离线安装PostgreSQL

    目录 一 理论 1 PostgreSQL 2 PostgreSQL离线安装 3 PostgreSQL初始化 4 PostgreSQL登录操作 二 实验 1 CentOS 7离线安装PostgreSQL 2 登录PostgreSQL 3 Na
  • 1:pandas创建DataFrame对象

    实例代码 import pandas as pd df pd DataFrame age 1 2 name 李华 大刘 print df age 和name为列的标题 中括号的为列的内容 前面的这个为索引 如果想以age为索引可以这样写 i
  • myfile

    淄博市公共就业招聘云平台 个人用户使用指导说明 淄博市公共就业招聘云平台是依托Hiturn 海豚 人才网 通过互联网技术 对现场招聘会进行全真模拟 为企业单位用户 个人求职用户搭建 同时支持电脑端与手机端的使用 并可在线交流 信息展示 简历
  • conda的使用教程

    conda的介绍 简单来说 conda软件就是来管理包的软件 以Python为例 在实际生活中 我们要处理多个不同的项目 因此 要安装不同的项目所需要的包 为了管理方便 conda就是用来打理不同项目的包 为不同项目创建不同虚拟环境 把不同
  • 制作HTML5百科页面

    先建一个index html 首页 代码如下 p align center a href page01 html target self img src images index jpg alt 传智播客设计学院UI设计师 a p 首页的效
  • java学习之路——第一次java(java的入门)

    java学习之路 第一次java java的入门 一 什么是java java语言是一种强类型的语言 其中包含一套基本的符号 这些符号构成了java语言的表示符和关键字 是一个跨平台的面向对象的程序设计语言 由Sun Microsystem
  • 离散数学第一章总结

    离散数学第一章 1 公式类型 1 重言式 也是永真式 公式真值恒为1 2 矛盾式 永假式 真值恒为0 3 可满足式 不是矛盾式的就都是可满足式 重言式一定是可满足式 2 成真赋值与成假赋值 也叫成真指派与成假指派 一组原子的取值 真值指派
  • Tensorflow计算、数据和运行模型

    参考书籍 Tensorflow实战Google深度学习框架 郑泽宇等 Tensorflow是一款谷歌开源的深度学习工具 与其他深度学习工具 比如caffe Deeplearning4j等 相比 其受关注度和欢迎程度尤为突出 在谷歌内部 Te
  • 02-Node.js—Buffer(缓冲器)

    文章目录 1 概念 2 特点 3 创建Buffer 3 1 Buffer alloc 3 2 Buffer allocUnsafe 3 3 Buffer from 4 操作Buffer 4 1 Buffer 与字符串的转化 4 2 Buff
  • H264实时编码及NALU,RTP传输

    原文引用地址 http wmnmtm blog 163 com blog static 382457142011920102618122 fromdm fromSearch isFromSearchEngine yes H264实时编码及N
  • linux中find命令详解,Linux下的find指令详解

    在Linux下有很多查找指令 locate whereis which find 在这些查找指令中功能最强大的当属find指令了 find命令在目录结构中搜索文件 并执行指定的操作 Linux下find命令提供了相当多的查找条件 功能很强大
  • linux shell数据重定向(输入重定向与输出重定向)详细分析

    在了解重定向之前 我们先来看看linux 的文件描述符 linux文件描述符 可以理解为linux跟踪打开文件 而分配的一个数字 这个数字有点类似c语言操作文件时候的句柄 通过句柄就可以实现文件的读写操作 用户可以自定义文件描述符范围是 3