前言

  首先我们需要知道exec是什么,exec是linux下面一个创建进程的方法,详情请参考:https://www.cnblogs.com/guge-94/p/11016176.html

重定向

概念

  • I/O重定向通常与FD有关
  • 三个常用FD(默认与keyboard、monitor、monitor有关)
  • 一般情况下,操作系统默认只存在这三个fd,但是我们通过ls去查看的时候发现会有一个大于2的fd,这是因为我们在查看的时候会有一个句柄产生,这个时候会生成一个新的fd
FD 说明
0 stdin,标准输入
1 stdout,标准输出
2 stderr,标准错误输出

查看文件描述符

ll /proc/$$/fd

重定向输出

&- 关闭标准输出
n&- 表示将 n 号输出关闭
述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定而不是缺省的 或 。如: ... >file 运行一个命令并把错误输出(文件描述符 )定向到 file。
... >& 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 来建立文件描述符 ,但效果通常是合并了两个流。)
我们对 >&1详细说明一下 :
  >& 也就是 FD2=FD1 ,这里并不是说FD2 的值等于FD1的值,因为 > 是改变送出的数据信道,也就是说把 FD2 的 “数据输出通道” 改为 FD1 的 “数据输出通道”。
  如果仅仅这样,这个改变好像没有什么作用,因为 FD2 的默认输出和 FD1 的默认输出本来都是 monitor,一样的!但是,当 FD1 是其他文件,甚至是其他 FD 时,这个就具有特殊的用途了。请大家务必理解这一点。

重定向恢复

如果 stdin, stdout, stderr 进行了重定向或关闭, 但没有保存原来的 FD, 可以将其恢复到 default 状态吗?

如果关闭了stdin,因为会导致退出,那肯定不能恢复。

如果重定向或关闭 stdout和stderr其中之一,可以恢复,因为他们默认均是送往monitor(但不知会否有其他影响)。

如果恢复重定向或关闭的 stdout: exec 1>&2 ,恢复重定向或关闭的stderr:exec 2>&1

如果stdout和stderr全部都关闭了,又没有保存原来的FD,可以用:exec 1>/dev/tty 恢复。

cmd >a 2>a 和 cmd >a 2>&1 为什么不同?

  • cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
  • cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。
  • 我想:他们的不同点在于:
  1. cmd >a 2>a 相当于使用了两个互相竞争使用文件a的管道;

  2. 而cmd >a 2>&1 只使用了一个管道,但在其源头已经包括了stdout和stderr。

  3. 从IO效率上来讲,cmd >a 2>&1的效率应该更高!

常用命令语法

exec >outfilename    # 打开文件outfilename作为stdout
exec >errfilename # 打开文件errfilename作为 stderr
exec &- # 关闭 FD1
exec >&- # 关闭 FD5 exec <& # 备份当前stdout至FD4
exec >.txt # stdout重定向至1.txt
exec <& # 恢复stdout
exec >&- # 关闭 FD4 exec >& # 将标准输出与fd 6绑定
exec >& # 将标准输出1恢复回来

示例

exec >&- >&-    # 关闭所有的输出

重定向输入

格式

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

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

示例

实例一:用catfile文件里面的内容代替键盘输出,输出到屏幕。
[root@asus-a53s data]# cp suc.test catfile
[root@asus-a53s data]# cat < catfile
Ls #这里如果内容过多,按下 [ctrl]+d 离开
[root@asus-a53s data]# cat suc.test
ls 实例二:从标准输入【键盘】获得数据,然后输出给catfile文件
[root@asus-a53s data]# cat > catfile << EOF #EOF可以是任何字符,代表结束
> hello,This is my test!
> EOF
[root@asus-a53s data]# cat catfile   #上面用的是重定向覆盖,所以ls内容不见了
hello,This is my test! 实例三:从test.sh 获得输入数据,然后输出给文件catfile
[root@asus-a53s data]# cat test.sh test1
test1
test1
[root@asus-a53s data]# cat > catfile < test.sh #这里在输入的时候不能用<<,因为<<同时是也代表结束输出
[root@asus-a53s data]# cat catfile test1
test1
test1

绑定重定向

格式

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

示例

实例一:学习exec的绑定使用
[chengmo@centos5 shell]$ exec >&
#将标准输出与fd 6绑定 [chengmo@centos5 shell]$ ls /proc/self/fd/ #出现文件描述符6 [chengmo@centos5 shell]$ exec >suc.txt
#将接下来所有命令标准输出,绑定到suc.txt文件(输出到该文件) [chengmo@centos5 shell]$ ls -al
#执行命令,发现什么都不返回了,因为标准输出已经输出到suc.txt文件了 [chengmo@centos5 shell]$ exec >&
#恢复标准输出 [chengmo@centos5 shell]$ exec >&-
#关闭fd 6描述符 [chengmo@centos5 ~]$ ls /proc/self/fd/

参考文档:

http://xstarcd.github.io/wiki/shell/exec_redirect.html

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

Shell重定向与exec的更多相关文章

  1. 18 shell 重定向以及文件描述符

    1.对重定向的理解 2.硬件设备和文件描述符 文件描述符到底是什么 3.Linux Shell 输出重定向 4.Linux Shell 输入重定向 5.结合Linux文件描述符谈重定向 6.Shell ...

  2. shell重定向调试信息

    shell重定向调试信息 fulinux ******************************************************************************* ...

  3. shell重定向介绍及使用

    我们在写脚本或用脚本时,往往会发现 > /dev/null 2>&1 这类的命令.之前都是简单的了解一下,并没有深度消化,直到自己写脚本时,不认真写成了2>&1 &g ...

  4. shell中sh, exec, source, fork, ./的区别

    shell中sh, exec, source, fork, ./的区别 1,sh sh test.sh ​ sh是通过创建子进程(subshell)去执行脚本,父进程无法使用子进程中的变量,而子进程对 ...

  5. Shell重定向:2>&1

    Shell重定向:2>&1 0 是一个文件描述符,表示标准输入(stdin) 1 是一个文件描述符,表示标准输出(stdout) 2 是一个文件描述符,表示标准错误(stderr) 重定 ...

  6. shell重定向输出的应用

                         shell重定向输出的应用 案例2:重定向输出的应用 2.1问题 本例要求编写一个脚本/root/out.sh,功能特性如下: 执行此脚本显示I love s ...

  7. shell 重定向以及文件描述符

    1.对重定向的理解 Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向:从字面上理解,输入输出重定向就是「改变输入与输出的方向」的意思. 输入方向就是数据从哪里流向程序.标准输入 ...

  8. Linux Shell 重定向与管道【转帖】

    by 程默 在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以 ...

  9. 遇到shell重定向的一个奇怪问题:'消失'的标准输入!

    需求: 把找到的文件逐行输出,然后用rm在许可的情况下删除   前置准备:  $ls rm.sh test1 test2 test3 test4 test5 test6 $cat rm.sh #! / ...

随机推荐

  1. 数据库基础之Mysql

    数据库的简介 数据库 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性, ...

  2. C# 中的IComparable和IComparer

    前言 在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,而int整数则是根据整数大小进行排序.但是在引用类型中(具 ...

  3. 使用app-inspector时报错connect ECONNREFUSED 127.0.0.1:8001的解决方案

    在使用 app-inspector -u udid时,报错如图所示 输入如下命令即可解决 npm config set proxy null 再次启动app-inspector即可成功

  4. U3D Shader_图片模糊处理

    shader"practice/12.14"{ properties { _MainTex("MainTex",2D) = ""{} } S ...

  5. 【题解】BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小生成基环森林)

    [题解]BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小生成基环森林) 神题 我的想法是,每行每列都要有匹配且一个点只能匹配一个,于是就把格点和每行每列建点出来做一个最小生成树,但是不 ...

  6. 【题解】 P2763 试题库问题(网络流)

    P2763 试题库问题 考虑一个试题要被加入进答案的集合有什么条件? 是某种类型 只算作一次 就这两种且的限制,所以我们用串联的方式连接"类型点"和"作用点". ...

  7. Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学

    题目链接:https://codeforces.com/contest/1265/problem/E 题目大意: 有 \(n\) 个步骤,第 \(i\) 个步骤成功的概率是 \(P_i\) ,每一步只 ...

  8. Ural1057. Amount of Degrees 题解 数位DP

    题目链接: (请自行百度进Ural然后查看题号为1057的那道题目囧~) 题目大意: Create a code to determine the amount of integers, lying ...

  9. Django之表高级操作

    目录 一.如何开启自己的测试脚本? 二.对表数据的添加.更新.删除 1.create() 2.update() 3.delete() 4.查看执行的sql语句 三. 单表查询13个操作 返回Query ...

  10. Java String类相关知识梳理(含字符串常量池(String Pool)知识)

    目录 1. String类是什么 1.1 定义 1.2 类结构 1.3 所在的包 2. String类的底层数据结构 3. 关于 intern() 方法(重点) 3.1 作用 3.2 字符串常量池(S ...