怎么用新浪云做淘宝客网站,周口seo优化,软件开发和网站建设,设计院排名前十强在了解重定向之前#xff0c;我们先来看看linux 的文件描述符。 linux文件描述符#xff1a;可以理解为linux跟踪打开文件#xff0c;而分配的一个数字#xff0c;这个数字有点类似c语言操作文件时候的句柄#xff0c;通过句柄就可以实现文件的读写操作。 用户可以自定义文… 在了解重定向之前我们先来看看linux 的文件描述符。 linux文件描述符可以理解为linux跟踪打开文件而分配的一个数字这个数字有点类似c语言操作文件时候的句柄通过句柄就可以实现文件的读写操作。 用户可以自定义文件描述符范围是3-num,这个最大数字跟用户的ulimit –n 定义数字有关系不能超过最大值。 linux启动后会默认打开3个文件描述符分别是标准输入standard input 0,正确输出standard output 1,错误输出error output 2 以后打开文件后。新增文件绑定描述符 可以依次增加。 一条shell命令执行都会继承父进程的文件描述符。因此所有运行的shell命令都会有默认3个文件描述符。 对于任何一条linux 命令执行它会是这样一个过程 一个命令执行了 先有一个输入输入可以从键盘也可以从文件得到 命令执行完成成功了会把成功结果输出到屏幕standard output默认是屏幕 命令执行有错误会把错误也输出到屏幕上面standard error默认也是指的屏幕 文件输入输出由追踪为一个给定的进程所有打开文件的整数句柄来完成。这些数字值就是文件描述符。最为人们所知的文件米描述符是 stdin, stdout 和stderr文件描述符的数字分别是01和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分别是标准输出错误输出。 实例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #显示当前目录文件 test.sh test1.sh test1.sh实际不存在 [chengmocentos5 shell]$ ls test.sh test1.sh ls: test1.sh: 没有这个文件和目录 test.sh #正确输出与错误输出都显示在屏幕了现在需要把正确输出写入suc.txt # 1可以省略不写默认所至标准输出 [chengmocentos5 shell]$ ls test.sh test1.sh 1suc.txt ls: test1.sh: 没有这个文件和目录 [chengmocentos5 shell]$ cat suc.txt test.sh #把错误输出不输出到屏幕输出到err.txt [chengmocentos5 shell]$ ls test.sh test1.sh 1suc.txt 2err.txt [chengmocentos5 shell]$ cat suc.txt err.txt test.sh ls: test1.sh: 没有这个文件和目录 #继续追加把输出写入suc.txt err.txt “”追加操作符 [chengmocentos5 shell]$ ls test.sh test1.sh 1suc.txt 2err.txt #将错误输出信息关闭掉 [chengmocentos5 shell]$ ls test.sh test1.sh 2- test.sh [chengmocentos5 shell]$ ls test.sh test1.sh 2/dev/null test.sh #[n] 代表是已经存在的文件描述符1 代表输出 2代表错误输出 -代表关闭与它绑定的描述符 #/dev/null 这个设备是linux 中黑洞设备什么信息只要输出给这个设备都会给吃掉 #关闭所有输出 [chengmocentos5 shell]$ ls test.sh test1.sh 1- 2- #关闭 1 2 文件描述符 [chengmocentos5 shell]$ ls test.sh test1.sh 2/dev/null 1/dev/null #将1,2 输出转发给/dev/null设备 [chengmocentos5 shell]$ ls test.sh test1.sh /dev/null 21 #将错误输出2 绑定给 正确输出 1然后将 正确输出 发送给 /dev/null设备 这种常用 p[chengmocentos5 shell]$ ls test.sh test1.sh /dev/null # 代表标准输出 错误输出 将所有标准输出与错误输出 输入到/dev/null文件 /p 注意 1、shell遇到””操作符会判断右边文件是否存在如果存在就先删除并且创建新文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。 2、“”操作符判断右边文件如果不存在先创建。以添加方式打开文件会分配一个文件描述符[不特别指定默认为1,2]然后与左边的标准输出1或错误输出2 绑定。 3、当命令执行完绑定文件的描述符也自动失效。0,1,2又会空闲。 4、一条命令启动命令的输入正确输出错误输出默认分别绑定0,1,2文件描述符。 5、一条命令在执行前先会检查输出是否正确如果输出设备错误将不会进行命令执行 输入重定向 格式 command-line [n] file或文件描述符设备 将然有命令默认从键盘获得的输入改成从文件或者其它打开文件以及设备输入。执行这个命令将标准输入0与文件或设备绑定。将由它进行输入。 实例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [chengmocentos5 shell]# cat catfile testing cat file test #这里按下 [ctrl]d 离开 #从标准输入【键盘】获得数据然后输出给catfile文件 [chengmocentos5 shell]$ catcatfile test.sh #cat 从test.sh 获得输入数据然后输出给文件catfile [chengmocentos5 shell]$ catcatfile eof test a file test! eof # 这个连续两个小符号 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符输入自动结束不用ctrlD exec绑定重定向 格式 exec 文件描述符[n] 或 file或文件描述符或设备 在上面讲的输入输出重定向 将输入输出绑定文件或设备后。只对当前那条指令是有效的。如果需要在绑定之后接下来的所有命令都支持的话。就需要用exec命令 实例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [chengmocentos5 shell]$ exec 61 #将标准输出与fd 6绑定 [chengmocentos5 shell]$ ls /proc/self/fd/ 0 1 2 3 6 #出现文件描述符6 [chengmocentos5 shell]$ exec 1suc.txt #将接下来所有命令标准输出绑定到suc.txt文件输出到该文件 [chengmocentos5 shell]$ ls -al #执行命令发现什么都不返回了因为标准输出已经输出到suc.txt文件了 [chengmocentos5 shell]$ exec 16 #恢复标准输出 [chengmocentos5 shell]$ exec 6- #关闭fd 6描述符 [chengmocentos5 ~]$ ls /proc/self/fd/ 0 1 2 3 说明使用前先将标准输入保存到文件描述符6这里说明下文件描述符默认会打开0,1,2 还可以使用自定义描述符 。然后对标准输出绑定到文件接下来所有输出都会发生到文件。 使用完后恢复标准的输出关闭打开文件描述符6。 有趣事情 可能有朋友会这样用exec 1suc.txt 接下来所有输出都绑定到suc.txt 文件那么怎么样恢复原来的呢 试试你就会发现问题所在…… 复杂一点实例 1 2 3 4 5 6 7 8 9 10 11 exec 3test.sh; #打开test.sh可读写操作与文件描述符3绑定 while read line3 do echo $line; done #循环读取文件描述符3读取的是test.sh内容 exec 3- exec 3- #关闭文件的输入输出绑定 总结下 学习就要总结总结才可以提高了。哈哈 估计还有一些朋友是头晕晕的。怎么linux的重定向这么复杂呢又是文件打开描述符又是读还有些还有默认标准输入输出。 其实总结一下重定向应用通常就以下两点 1、重新设置命令的默认输入输出指向到自己文件文件文件描述符设备其实都是文件因为linux就是基于设备也是文件描述符也指向是文件哈哈 2、扩展自己新的描述符对文件进行读写操作