#exec命令用于启动一个新的shell,并在新的shell中执行指定命令。在实际应用中,exec命令被用来 处理文件描述符,此时(也只在此时)exec不会启动新shell替代当前的shell。

 1 root@ubuntu:/home/dyx/linux :: # cat ping.txt
PING baidu.com (220.181.111.85) () bytes of data.
bytes from 220.181.111.85: icmp_req= ttl= time=32.1 ms
bytes from 220.181.111.85: icmp_req= ttl= time=31.3 ms
bytes from 220.181.111.85: icmp_req= ttl= time=31.8 ms --- baidu.com ping statistics ---
packets transmitted, received, % packet loss, time 10154ms
rtt min/avg/max/mdev = 31.321/31.770/32.115/0.391 ms
root@ubuntu:/home/dyx/linux :: # exec <ping.txt ;read -u name1;read -u name2;echo -e "$name1 \n $name2";exec <&-
PING baidu.com (220.181.111.85) () bytes of data.
bytes from 220.181.111.85: icmp_req= ttl= time=32.1 ms #3<表示一个输入文件描述符3;
 root@ubuntu:/home/dyx/linux :: # exec >name_list;read name1;read name2;echo -e "The first string:$name1 \n The second string:$name2" >&; exec >&-;cat name_list
dyx
zhouxiaoyu
The first string:dyx
The second string:zhouxiaoyu

exec和文件描述符的一个应用;

基础知识

文件描述符(File Descriptor),是进程对其所打开文件的索引,形式上是个非负整数。类 Unix 系统中,常用的特殊文件描述符如下:

文件描述符 名称 常用缩写 默认值
0 标准输入 stdin 键盘
1 标准输出 stdout 屏幕
2 标准错误输出 stderr 屏幕

我们在简单地用 <  > 时,相当于使用 0<  1> (下面会详细介绍)。

管道 (“|”, pipe line),把上一个命令的 stdout 接到下一个命令的 stdin;

tee 命令的作用是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;

简单重定向

  • cmd > file
把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bash的noclobber选项可以防止覆盖原有文件。
  • cmd >> file
把cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件后面。
  • cmd < file
使cmd命令从file读入
  • cmd << text
从命令行读取输入,直到一个与text相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换。如果使用 <<- ,则会忽略接下来输入行首的tab,结束行也可以是一堆tab再加上一个与text相同的内容,可以参考后面的例子。
  • cmd <<< word
把word(而不是文件word)和后面的换行作为输入提供给cmd。
  • cmd <> file
以读写模式把文件file重定向到输入,文件file不会被破坏。仅当应用程序利用了这一特性时,它才是有意义的。
  • cmd >| file
功能同>,但即便在设置了noclobber时也会覆盖file文件,注意用的是|而非一些书中说的!,目前仅在csh中仍沿用>!实现这一功能。

使用文件描述符的重定向

使用文件描述符的重定向都使用了&符号。

cmd >&n 把输出送到文件描述符n
cmd m>&n 把输出 到文件符m的信息重定向到文件描述符n
cmd >&- 关闭标准输出
cmd <&n 输入来自文件描述符n
cmd m<&n m来自文件描述各个n
cmd <&- 关闭标准输入
cmd <&n- 移动输入文件描述符n而非复制它。(需要解释)
cmd >&n- 移动输出文件描述符 n而非复制它。(需要解释)

注意: 
>&实际上复制了文件描述符,这使得ls > dirlist 2>&1与ls 2>&1 > dirlist的效果不一样。man bash的Redirection节中提及了这段内容。

重定向的组合应用

cmd 2>file 把文件描述符2重定向到file,即把错误输出存到file中。
cmd > file 2>&1 把标准错误重定向到标准输出,再重定向到file,即stderr和stdout都被输出到file中
cmd &> file 功能与上一个相同,更为简便的写法。
cmd >& file 功能仍与上一个相同。
cmd > f1 2>f2 把stdout重定向到f1,而把stderr重定向到f2
tee files 把stdout原样输出的同时,复制一份到files中。
tee files 把stderr和stdout都输出到files中,同时输出到屏幕。

重定向实例

Template:Bash重定向实例

类似重定向的功能

下面的一些用法并不属于重定向的范畴,但和重定向较为类似。

进程替换

bash在某些系统中的特性,可以将输入输出转到另一个程序中去,可以同时输出个多个程序,使用方法是>(list)<(list),如[1]

wget -O - http://example.com/dvd.iso \
| tee >(sha1sum > dvd.sha1) \
>(md5sum > dvd.md5) \
> dvd.iso

巧妙地同时完全了SHA-1MD5校验工作。

参考:

http://www.linux-wiki.cn/index.php/Bash%E7%9A%84%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91

linux中文件描述符的更多相关文章

  1. Linux中文件描述符fd和文件指针flip的理解

    转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...

  2. [转载] linux中文件描述符fd和文件指针flip的理解

    转载自http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...

  3. 对于Linux中文件描述符的疑问以及解决

    问题 ​ 每次web服务器或者是几乎所有Linux服务器都需要对文件描述符进行调整,我使用ulimit -n来查看当前用户的最多能打开的文件,默认设置的是1024个,但是系统运行起来以及开启一些简单的 ...

  4. LINUX中文件描述符传递

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. Linux下文件描述符

    http://blog.csdn.net/kumu_linux/article/details/7877770 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的 ...

  6. linux 最大文件描述符fd

    使用四种框架分别实现百万websocket常连接的服务器 著名的 C10K 问题提出的时候, 正是 2001 年.这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务 ...

  7. Linux Shell 文件描述符 及 stdin stdout stderr 重定向

    Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...

  8. linux 最大文件描述符

    Linux对应用程序能打开的的最大文件描述符数量有两个层次的限制:用户级限制和系统级限制. 用户级限制是指目标用户运行的所有进程总共能打开的文件描述符数. 系统级的限制是指所有用户总共能打开的文件描述 ...

  9. 【详解】Linux的文件描述符fd与文件指针FILE*互相转换

    使用系统调用的时候用文件描述符(file descriptor,简称fd)的时候比较多,但是操作比较原始.C库函数在I/O上提供了一些方便的包装(比如格式化I/O.重定向),但是对细节的控制不够. 如 ...

随机推荐

  1. c#每循环100次提交一次数据,最后一次不足100次提交一次

    StringBuilder sb=new StringBuilder(); string strId=dataGridView1.Rows[dataGridView1.CurrentRow.Index ...

  2. 考研心得--一个差劲的ACMer

    考研心得   --ACMer(山东工商学院) 2019年2月20日星期三(正月十六),打开QQ音乐,播放<告别都市>,应同学要求,也是给自己奋斗一年多时间的“考研大业”一个交代,写下这篇考 ...

  3. 发行说明 - Kafka - 版本1.0.0

    发行说明 - Kafka - 版本1.0.0 以下是Kafka 1.0.0发行版中解决的JIRA问题的摘要.有关该版本的完整文档,入门指南以及有关该项目的信息,请参阅Kafka项目网站. 有关升级的注 ...

  4. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  5. [openjudge6043]哆啦A梦的时光机

    [openjudge6043]哆啦A梦的时光机 试题描述 哆啦A梦有一个神奇的道具:时光机.坐着它,大雄和他的伙伴们能穿越时空,回到过去或者去到未来. 有一天,大雄和他的伙伴们想穿越时空进行探险,可是 ...

  6. [nowcoder_Wannafly挑战赛4_F]线路规划

    [nowcoder_Wannafly挑战赛4_F]线路规划 试题描述 Q国的监察院是一个神秘的组织. 这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人. 监察院一共有 \(N\) 个成员,每一个 ...

  7. HashMap实现原理及源码分析(jdk1.8)

    HashMap底层由数组+链表+红黑树组成,可接受null值,非线程安全 1.基本属性 transient Node<K,V>[] table; //hashmap数组 static fi ...

  8. codechef May Challenge 2016 CHSC: Che and ig Soccer dfs处理

    Description All submissions for this problem are available. Read problems statements in Mandarin Chi ...

  9. bzoj 2503 相框 分类讨论

    题目大意:给定一张无向图,每次可以进行以下两种操作: 1.将一个点分裂成一些点,原先这个点连接的每条边任选一个新点进行连接 2.将两个度数为1的点合并为1个点 求将这个图变成一个环的最小操作次数 我们 ...

  10. 收集邮票(bzoj 1426)

    Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也 ...