




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
希望对大家有所帮助1. 标准输入的控制语法:命令 文件将文件做为命令的输入。例如:mail -s “mail test” 文件将命令的执行结果送至指定的文件中。例如:ls -l list 将执行“ls -l” 命令的结果写入文件list 中。语法:命令! 文件将命令的执行结果送至指定的文件中,若文件已经存在,则覆盖。例如:ls -lg ! list 将执行“ls - lg” 命令的结果覆盖写入文件list 中。语法:命令& 文件将命令执行时屏幕上所产生的任何信息写入指定的文件中。例如:cc file1.c & error 将编译file1.c 文件时所产生的任何信息写入文件error 中。语法:命令 文件将命令执行的结果附加到指定的文件中。例如:ls - lag list 将执行“ls - lag” 命令的结果附加到文件list 中。语法:命令& 文件将命令执行时屏幕上所产生的任何信息附加到指定的文件中。例如:cc file2.c & error 将编译file2.c 文件时屏幕所产生的任何信息附加到文件error 中。关于输入、输出和错误输出在字符终端环境中,标准输入/标准输出的概念很好理解。输入即指对一个应用程序或命令的输入,无论是从键盘输入还是从别的文件输入;输出即指应用程序或命令产生的一些信息;与 Windows 系统下不同的是,Linux 系统下还有一个标准错误输出的概念,这个概念主要是为程序调试和系统维护目的而设置的,错误输出于标准输出分开可以让一些高级的错误信息不干扰正常的输出信息,从而方便一般用户的使用。在 Linux 系统中:标准输入(stdin)默认为键盘输入;标准输出(stdout)默认为屏幕输出;标准错误输出(stderr)默认也是输出到屏幕(上面的 std 表示 standard)。在 BASH 中使用这些概念时一般将标准输出表示为 1,将标准错误输出表示为 2。下面我们举例来说明如何使用他们,特别是标准输出和标准错误输出。输入、输出及标准错误输出主要用于 I/O 的重定向,就是说需要改变他们的默认设置。先看这个例子:$ ls ls_result$ ls -l ls_result上面这两个命令分别将 ls 命令的结果输出重定向到 ls_result 文件中和追加到 ls_result 文件中,而不是输出到屏幕上。就是输出(标准输出和标准错误输出)重定向的代表符号,连续两个 符号,即 则表示不清除原来的而追加输出。下面再来看一个稍微复杂的例子:$ find /home -name lost* 2 err_result这个命令在 符号之前多了一个 2,2 表示将标准错误输出重定向。由于 /home 目录下有些目录由于权限限制不能访问,因此会产生一些标准错误输出被存放在 err_result 文件中。大家可以设想一下 find /home -name lost* 2err_result 命令会产生什么结果?如果直接执行 find /home -name lost* all_result ,其结果是只有标准输出被存入 all_result 文件中,要想让标准错误输出和标准输入一样都被存入到文件中,那该怎么办呢?看下面这个例子:$ find /home -name lost* all_result 2& 1上面这个例子中将首先将标准错误输出也重定向到标准输出中,再将标准输出重定向到 all_result 这个文件中。这样我们就可以将所有的输出都存储到文件中了。为实现上述功能,还有一种简便的写法如下:$ find /home -name lost* & all_result如果那些出错信息并不重要,下面这个命令可以让你避开众多无用出错信息的干扰:$ find /home -name lost* 2 /dev/null同学们回去后还可以再试验一下如下几种重定向方式,看看会出什么结果,为什么?$ find /home -name lost* all_result 1& 2$ find /home -name lost* 2 all_result 1& 2$ find /home -name lost* 2& 1 all_result另外一个非常有用的重定向操作符是 -,请看下面这个例子:$ (cd /source/directory & tar cf - . ) | (cd /dest/directory & tar xvfp -)该命令表示把 /source/directory 目录下的所有文件通过压缩和解压,快速的全部移动到 /dest/directory 目录下去,这个命令在 /source/directory 和 /dest/directory 不处在同一个文件系统下时将显示出特别的优势。下面还几种不常见的用法:n&- 表示将 n 号输入关闭&- 表示将 n 号输出关闭&- 表示将标准输出关闭-他问我为什么要用 /dev/null 2&1 这样的写法.这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃.下面我就为大家来说一下, command file 2file 与command file 2&1 有什么不同的地方. 首先command file 2file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command file 2file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道. 而command file 2&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容. 从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会用command file 2&1 这样的写法.-Linux shell I/O重定向详解I/O重定向详解及应用实例1、 基本概念(这是理解后面的知识的前提,请务必理解)a、 I/O重定向通常与 FD有关,shell的FD通常为10个,即 09;b、 常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、monitor、monitor有关;c、 用 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;e、 0 是 的默认值,因此 与 0 与 1 是一样的;f、 在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;g、 管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin;h、 tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;i、 bash(ksh)执行命令的过程:分析命令变量求值命令替代(和$( ))重定向通配符展开确定路径执行命令;j、 ( ) 将 command group 置于 sub-shell 去执行,也称 nested sub-shell,它有一点非常重要的特性是:继承父shell的Standard input, output, and error plus any other open file descriptors。k、 exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现有环境都将会被清除,。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。2、 基本IOcmd file 把 stdout 重定向到 file 文件中cmd file 把 stdout 重定向到 file 文件中(追加)cmd 1 fiel 把 stdout 重定向到 file 文件中cmd file 2&1 把 stdout 和 stderr 一起重定向到 file 文件中cmd 2 file 把 stderr 重定向到 file 文件中cmd 2 file 把 stderr 重定向到 file 文件中(追加)cmd file 2&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加)cmd file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdoutcat file 以读写的方式打开 filecmd file cmd 命令以 file 文件作为 stdincmd &n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出&n 标准输入复制自文件描述符 n&- 关闭标准输出n&- 表示将 n 号输出关闭上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。如:. 2file 运行一个命令并把错误输出(文件描述符 2)定向到 file。. 2&1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流。)我们对 2&1详细说明一下 :2&1 也就是 FD2FD1 ,这里并不是说FD2 的值 等于FD1的值,因为 是改变送出的数据信道,也就是说把 FD2 的 “数据输出通道” 改为 FD1 的 “数据输出通道”。如果仅仅这样,这个改变好像没有什么作用,因为 FD2 的默认输出和 FD1的默认输出本来都是 monitor,一样的!但是,当 FD1 是其他文件,甚至是其他 FD 时,这个就具有特殊的用途了。请大家务必理解这一点。exec 0exec 1outfilename # 打开文件outfilename作为stdoutexec 2errfilename # 打开文件 errfilename作为 stderrexec 0&- # 关闭 FD1exec 5&- # 关闭 FD5问:如果关闭了 FD0、FD1、FD2,其后果是什么?恢复 FD0、FD1、FD2与 关闭FD0、FD1、FD2 有什么区别?代码分别是什么?打开了FD3FD9,我们用完之后,你觉得是将他们关闭还是恢复?下面是提示(例子来源于CU一帖子,忘记出处,来日再补上):exec 6&2 2vercommand dev/null &exec 2&6 # 恢复 FD24、 简单举例(其中 you 这个文件是存在的,no和yes这两个文件不存在)a、stdout和stderr都通过管道送给egrep了:(ls you no 2&1;ls yes 2&1) 2&1|egrep * file(ls you no 2&1;ls yes 2&1)|egrep * file(ls you no;ls yes) 2&1|egrep * file#这个例子要注意的就是:理解 命令执行顺序 和 管道“|”:在命令执行前,先要进行重定向的处理,并将把 nested sub-shell 的stdout 接到 egrep 命令的 stdin。nested sub-shell ,在 ( ) 中的两个命令加上(),可以看作一个命令。其 FD1 已经连接到“|”往egrep送了,当遇到 2&1时,也就是FD2FD1,即FD2同FD1一样,往管道 “|”那边送。#b、没有任何东西通过管道送给egrep,全部送往monitor。(ls you no 2&1;ls yes 2&1) &2|egrep * file虽然在()里面将 FD2转往FD1,但在()外,遇到 &2 ,结果所有的都送到monitor。请理解:(ls you no 2&1) 1&2|egrep * file # 送到 monitorls you no 2&1 1&2|egrep * file # 送给 管道 “|”ls you no 1&2 2&1|egrep * file # 送到 monitor5、 中阶例子(其中 you 这个文件是存在的,no和yes这两个文件不存在)r2007兄的:/forum/viewtopic.php?t=221848&show_type=new&sid=cf30398c911e0d2b16313c6922123f67条件:stderr通过管道送给egrep,正确消息仍然送给monitor(不变)exec 4&1;(ls you no 2&1 1&4 4&-;ls yes 2&1 1&4 4&-)|egrep * file;exec 4&-或者exec 4&1;(ls you no;ls yes) 2&1 1&4 4&-|egrep * file;exec 4&-r2007 兄在其贴已有详细说明,我就不在说明了。如果加两个条件:(1)要求cmd1和cmd2并行运行;(2)将cmd1的返回值赋给变量 ss。则为:exec 3&1;exec 4&1ss=$(ls you no 2&1 1&3 3&-;echo $? &4)|egrep * file) 4&1)exec 3&-;exec 4&-说明:exec 3&1;4&1# 建立FD3,是用来将下面ls那条语句(子shell)中的FD1 恢复到正常FD1,即输出到monitor,你可以把FD3看作最初始的FD1的硬盘备份(即输出到monitor);# 建立FD4,到时用作保存ls的返回值(echo $?),你可以将FD4看作你考试时用于存放计算“echo $?”的草稿纸;(ls you no 2&1 1&3 3&-;echo $? &4)# 大家还记得前面说的子shell和管道吧。这条命令首先会继承FD0、FD1、FD2、FD3、FD4,它位于管道前,所以在运行命令前会先把子shell自己的FD1和管道“|”相连。但是我们的条件是stderr通过管道送往egrep,stdout仍然输出到monitor。于是通过2&1,先把 子shell的FD1 的管道“送给”FD2,于是子shell中的stderr送往管道“|”;再通过 1&3,把以前的“硬盘备份”恢复给子shell的FD1,于是子shell中的FD1变成送到monitor了。再通过3&- ,将3关闭;接着运行echo $? ,本来其输出值应该送往管道的,通过 &4 ,将 输出 送往 “草稿纸”FD4,留以备用。(ls you no 2&1 1&3 3&-;echo $? &4)|egrep * file)于是,stderr 通过管道送给 egrep ,stdout 送给monitor,但是,还有 FD4,它送到哪去了?$(ls you no 2&1 1&3 3&-;echo $? &4)|egrep * file) 4&1)最后的 4&1 ,就是把FD4 重定向到 FD1。但由于其输出在 $( )中,其值就赋给变量ss了。最后一行关闭 FD3、FD4。6、 高阶例子lightspeed 版主大大的:Shell 经典问题之 I/O 重定向 (/forum/viewtopic.php?t=452079&show_type=new)Q 对于命令 cmd1, cmd2, cmd3, cmd4. 如何利用单向管道完成下列功能:1. 所有命令并行执行2. cmd1 和 cmd2 不需要 stdin3. cmd1 和 cmd2 的 stdout 定向到 cmd3 的 stdin4. cmd1 和 cmd2 的 stderr 定向到 cmd4 的 stdin5. cmd3 的 stdout 定向到文件 a, stderr 定向到屏幕6. cmd4 的 stdout 定向到文件 b, stderr 定向到屏幕7. cmd1 的返回码赋给变量 s8. 不能利用临时文件解决方法:exec 3&1; exec 4&1s=$(cmd1 1&3 ; echo $? &4 )| cmd2 ) 3&1 | cmd3 a 2&3 ) 2&1 | cmd4 b ) 4&1)exec 3&-; exec 4&-这个我一步步解释(好复杂,自己感觉看明白了,过一会再看,大脑仍然有几分钟空白,没想到我也能看明白):exec 3&1; exec 4&1# 前面的例子都有说明了,就是建立FD3 ,给cmd1恢复其FD1用和给cmd3 恢复其FD2用# 建立FD4,保存“echo $?”输出值的“草稿纸”第一对括号:(cmd1 1&3 ; echo $? &4 ) 和其后(第一个)管道# 在第一个括号(子shell)中,其FD1已经连到 管道中了,所以用 FD3 将 FD1恢复正常,不让他往管道跑;# 这里的cmd1没有stdin,接着将 cmd1 运行的返回码 保存到 FD4 中;第二对括号:(cmd1 1&3 ; echo $? &4 )| cmd2 ) 3&1 和其后(第二个)管道# 前面的 FD1 已经不送给 cmd2了,FD2 默认也不送过来,所以cmd2 也没有stdin ,所以在第二对括号里面:cmd1和cmd2 的stdout、stderr 为默认输出,一直遇到 “3&1”为止。# 请注意:“3&1”,先将第二对括号看出一个命令,他们遇到 第二个管道时,其FD1 连到 管道 “|”,由于“3&1”的作用,子shell的FD1 送给FD3 使用,所以所有FD3 的输出都 “流往”cmd3,又由于继承关系(继承第一行的命令),FD3实际上就是cmd1和cmd2的stdout,于是“ cmd1 和 cmd2 的 stdout 定向到 cmd3 的 stdin”第三对括号:(cmd1 1&3 ; echo $? &4 )| cmd2 ) 3&1 | cmd3 a 2&3 ) 2&1 和其后的第三个管道# cmd1 和 cmd2 的 stdout 已经定向到 cmd3 的 stdin,处理之后,cmd3 a 意味着将其 stdout 送给 a 文件。而2&3的意思是:恢复cmd3的错误输出为FD3,即送往 monitor。于是“cmd3 的 stdout 定向到文件 a, stderr 定向到屏幕”。如果没有“2&3”,那么cmd3的错误输出就会干扰cmd1和cmd2的错误输出,所以它是必须的!# 请注意第三对括号后的 “2&1”| ,其子shell的FD1 本来连接着管道“|”,但子shell FD1 慷慨大方,送给了 FD2,于是FD2 连接着管道。还记得前面的 cmd1 和 cmd2 吗?他们的stderr一直没动了。于是在这里,通过管道送给了第四个命令cmd4 了。即“cmd1 和 cmd2 的 stderr 定向到 cmd4 的 stdin”# 后面就比较简单了。cmd4 b 表示“cmd4 的 stdout 定向到文件 b, stderr 定向到屏幕(默认)”第四对括号:(cmd1 1&3 ; echo $? &4 )| cmd2 ) 3&1 | cmd3 a 2&3 ) 2&1 | cmd4 b ) 与其后的 4&1# 四对括号里面的 FD1、FD2都处理完了。但是还记得前面“echo $? &4”那块“草稿纸”吗?“4&1”的作用就是“将草稿纸上的内容送给monitor”,但是由于最外面还有 $() 将其“包着”。于是其值赋给变量“s”。我尝试回答下面的问题。如有错误,还请各位前辈指正!7、 在一个交互式的(Interactive) shell 中, 用 exec 进行 I/O 重定向.1). Stdin, stderr 可以定向到文件中吗? 有什么结果?a、 在交互式shell中,可以将stdin定向到文件。执行:exec 0结果为:in 文件中每一行均会被自动执行,并且在最后会再加执行一个 exit 命令,导致退出(或退回到正常shell下)。如 in 文件内容:$ more indateread lspecho hahhaecho this is $lsp在提示符下执行命令:$ exec 0$ dateTue Jan 18 18:29:07 HKT 2005$ read lsp # 其下面本应有的那句“ echo hahha ”的 “hahaha” 已经被读入到变量 lsp 中了$ echo this is $lspthis is echo hahha$ exitb、 在交互式shell中,可以将stderr定向到文件。执行:exec 2err结果为:命令提示符PS被屏蔽,输入的命令也被屏蔽。但是命令执行的结果,如果是stdout 则会回显到屏幕上,如果是 stderr 则不会回显到屏幕上。其中,命令提示符、命令、stderr均会保存到文件 err 中。如:$ exec 2errerr in out # 执行 ls 命令Tue Jan 18 18:55:58 HKT 2005 # 执行 date 命令,而后执行了“ ls nofile”,nofile这个文件不存在$ # 执行 exit 命令现在让我们查看 err文件:$ more errlspii lsp$
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年区块链金融行业应用前景研究报告
- 2025年医疗健康行业智能医疗设备市场前景展望报告
- 国家事业单位招聘2025国家海洋标准计量中心招聘应届毕业生拟聘人员笔试历年参考题库附带答案详解
- 吉林省2025年吉林白城通榆县事业单位引进急需紧缺人才笔试历年参考题库附带答案详解
- 南宁市2025广西南宁市青秀区委政法委招聘2人笔试历年参考题库附带答案详解
- 克拉玛依市2025新疆克拉玛依市企事业单位高层次急需紧缺人才引进(493人)笔试历年参考题库附带答案详解
- 乌兰察布市2025内蒙古乌兰察布市四子王旗高层次和紧缺急需人才引进46人笔试历年参考题库附带答案详解
- 2025重庆国咨数据服务有限公司招聘18人笔试参考题库附带答案详解
- 2025甘肃张掖市发展投资集团有限公司招聘专业技术人员6人笔试参考题库附带答案详解
- 2025河南空港数字城市开发建设有限公司第一批社会招聘20人笔试参考题库附带答案详解
- 危重患者皮肤管理课件
- 2025年国防教育知识竞赛试题(附答案)
- 工伤受伤经过简述如何写
- 银行现金取款申请书
- 人事外包招聘代理合同
- 数字经济学-课件 第3章 数字技术
- AI引领时尚设计新潮-个性化需求的新一代解决方案
- 高二数学直线倾斜角与斜率同步练习题
- 2024-2030年全球及中国热障涂层(TBC)行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 大轻质泡沫混凝土研究报告
- 室内装修工程质量保障措施方案
评论
0/150
提交评论