linux中文件描述符
#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中,同时输出到屏幕。 |
重定向实例
类似重定向的功能
下面的一些用法并不属于重定向的范畴,但和重定向较为类似。
进程替换
bash在某些系统中的特性,可以将输入输出转到另一个程序中去,可以同时输出个多个程序,使用方法是>(list)或<(list),如[1]:
wget -O - http://example.com/dvd.iso \
| tee >(sha1sum > dvd.sha1) \
>(md5sum > dvd.md5) \
> dvd.iso
参考:
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中文件描述符的更多相关文章
- Linux中文件描述符fd和文件指针flip的理解
转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
- [转载] linux中文件描述符fd和文件指针flip的理解
转载自http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
- 对于Linux中文件描述符的疑问以及解决
问题 每次web服务器或者是几乎所有Linux服务器都需要对文件描述符进行调整,我使用ulimit -n来查看当前用户的最多能打开的文件,默认设置的是1024个,但是系统运行起来以及开启一些简单的 ...
- LINUX中文件描述符传递
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- Linux下文件描述符
http://blog.csdn.net/kumu_linux/article/details/7877770 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的 ...
- linux 最大文件描述符fd
使用四种框架分别实现百万websocket常连接的服务器 著名的 C10K 问题提出的时候, 正是 2001 年.这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务 ...
- Linux Shell 文件描述符 及 stdin stdout stderr 重定向
Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...
- linux 最大文件描述符
Linux对应用程序能打开的的最大文件描述符数量有两个层次的限制:用户级限制和系统级限制. 用户级限制是指目标用户运行的所有进程总共能打开的文件描述符数. 系统级的限制是指所有用户总共能打开的文件描述 ...
- 【详解】Linux的文件描述符fd与文件指针FILE*互相转换
使用系统调用的时候用文件描述符(file descriptor,简称fd)的时候比较多,但是操作比较原始.C库函数在I/O上提供了一些方便的包装(比如格式化I/O.重定向),但是对细节的控制不够. 如 ...
随机推荐
- mojoportal中使用jquey的插件
以前在mojo中使用jquery的插件,都是把插件的文件内容直接写到了相关的模块中,这样的问题是不整洁,一大串代码. 如果直接在layout.master中引入插件文件,或者在自定义模块中引入插件文件 ...
- 设计模式(一)单例模式:2-懒汉模式(Lazy)
思想: 相比于饿汉模式,懒汉模式实际中的应用更多,因为在系统中,“被用到时再初始化”是更佳的解决方案. 设计思想与饿汉模式类似,同样是持有一个自身的引用,只是将 new 的动作延迟到 getinsta ...
- jQuery操作DOM基础 - 元素属性的查看与设置
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 记一次 pip list --outdated 错误
在 Windows CMD 执行 pip list --outdated,出现如下错误:" [WinError 10061] 由于目标计算机积极拒绝,无法连接",原因是我之前用的源 ...
- [ZZOJ#31]类欧几里得
[ZZOJ#31]类欧几里得 试题描述 这是一道模板题. 给出 \(a, b, c, n\),请你求出 \(\sum_{x=0}^n{\lfloor \frac{a \cdot x + b}{c} \ ...
- linux系统初始化——启动脚本是如何工作的
启动脚本是如何工作的 Linux 使用的是基于 运行级(run-levels) 概念的称为 SysVinit 的专用启动工具.它在不同的系统上可能是完全不一样的,所以不能认为一个脚本在某个 Linux ...
- git filter-branch应用
1.修改author和committer git filter-branch --commit-filter ' export GIT_AUTHOR_EMAIL=me@example.com; exp ...
- Codeforces Round #323 (Div. 2) B 贪心,暴力
B. Robot's Task time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- python 小练习1
_input = ['I',6,6,'love','python',6] _str = '' _sum = 0 for item in _input: if isinstance(item,str): ...
- IDA 调试 Android
最近都在学一些反编译安卓相关的东西,其实网上有很多教程关于用 IDA 调试 Android 的过程,主要记录一下我遇到的坑 首先 Android手机要是root过的 还要注意的一点是apk中的 And ...