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数据重定向(输入重定向与输出重定向)详细分析 的相关文章

  • Ansible 权限问题

    我正在尝试将当前用户添加到系统中的某个组 然后执行需要该组权限的命令 我的剧本是这样的 name Add this user to RVM group sudo true user state present name vagrant ap
  • 如何找到某个命令的目录?

    我知道 当您使用 shell 时 唯一可以使用的命令是可以在 PATH 上设置的某些目录中找到的命令 即使我不知道如何查看 PATH 变量上的目录 这是另一个可以回答的好问题 我想知道的是 我来到 shell 并写道 lshw 我想知道 s
  • 传递到 mvn exec:java 时保留参数间距等

    我有一个启动 Maven exec java 进程的 shell 脚本 exec mvn exec java Dexec mainClass Dexec args 现在可悲的是如果我跑步 myMagicShellScript arg1 ar
  • shell进程的并行执行

    有没有一个工具可以在 Windows 批处理文件中并行执行多个进程 我发现了一些有趣的 Linux 工具 parallel http mi eng cam ac uk er258 code parallel html and PPSS ht
  • 在大型文本文件中查找重复记录

    我在一台 Linux 机器 Redhat 上 并且有一个 11GB 的文本文件 文本文件中的每一行包含单个记录的数据 并且该行的前 n 个字符包含该记录的唯一标识符 该文件包含略多于 2700 万条记录 我需要验证文件中不存在具有相同唯一标
  • 如何在 ubuntu 上的 emacs 中运行 shell 命令,同时避免 bash 作业控制错误?

    我在 ubuntu 中安装了 emacs 使用 sudo apt get install emacs 我遇到的问题是 当我尝试从 emacs 中运行 shell 命令时 例如M ls 输出之前是这样的 bash cannot set ter
  • “排序文件名 | uniq”不适用于大文件

    我可以从小文本文件中删除重复条目 但不能从大文本文件中删除重复条目 我有一个 4MB 的文件 文件的开头如下所示 aa aah aahed aahed aahing aahing aahs aahs aal aalii aalii aali
  • 打印一个字符串,并将其特殊字符打印为文字转义序列

    我在 shell bash 脚本中有一个字符串 我想打印字符串 并将其所有 特殊字符 例如换行符 制表符等 打印为文字转义序列 例如换行符打印为 n 选项卡打印为 t 等等 不确定我是否使用了正确的术语 该示例应该能够澄清问题 Exampl
  • 将多个参数传递给 UNIX shell 脚本

    我有以下 bash shell 脚本 理想情况下我会用它来按名称杀死多个进程 bin bash kill ps A grep awk print 1 然而 虽然此脚本有效 但传递了一个参数 端镀铬 脚本名称为end 如果传递多个参数 则它不
  • 使用 GIT_PS1_SHOWCOLORHINTS 自定义 __git_ps1 的颜色

    我尝试过的 我已更新我的提示以包含分支名称 git ps1 另外 我设置GIT PS1 SHOWCOLORHINTS 问题 提示正确显示 然而 树枝的颜色始终是绿色的 我预计肮脏的树枝会是红色的 文档指出 颜色基于 git status s
  • 如何在 Laravel 中存储非 php 文件的模板?

    我们可以存储PHP模板文件使用bladeLaravel 中的模板引擎 但是 我想在远程服务器上创建一个配置文件 每个文件包含 20 30 行以上 到目前为止 我一直在使用Perl 我曾经执行 Perl 文件 该文件用于将内容转储到一个文件中
  • 模拟用户输入以使用不同参数多次调用脚本

    我必须使用提供的脚本 该脚本在脚本运行时接受用户输入而不是参数 我无法解决这个问题 脚本的一个例子是 bin bash echo param one read one doSomething echo param two read two
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我
  • 如何替换带引号的多单词字符串作为参数?

    我正在尝试替换包含多个带引号的单词的字符串变量作为命令的参数 因此 给出以下示例脚本 请注意 shebang 中的 x 这会导致输出被记录到 stderr bin bash x myArg hello world echo string i
  • 如何使用 cron 作业运行 python 文件

    您好 我创建了一个 python 文件 例如file example py 该文件将输出 sensex 值 假设该文件在linux系统上的路径为 Desktop downloads file example py 我通常会运行该文件pyth
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 使用 cURL 从 shell 发布 4GB 文件

    我尝试将文件大小为 4GB 的文件发布到 REST API cURL 不会上传此大小的文件 而是 POST 内容长度为 0 的文件 curl v i d work large png H Transfer Encoding chunked
  • 如何在bash中仅提取两个字符串之间多行的第一个实例?

    我的文件是 abc 123 xyz abc 675 xyz 我想提取 abc 123 xyz 123 可以是任何东西 重点是我想要第一次出现 我尝试使用这个 sed n abc xyz p filename 但这给了我所有的例子 我怎样才能
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f

随机推荐

  • 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