
谈到数据流重定向,我们首先需要了解文件描述符的概念。对于linux内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程等返回一个文件描述符。按照惯例,unix系统shell把文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误关联。总结如下:
标准输入:文件描述符0,通常指键盘的输入 。使用符号<或<<
标准输出:文件描述符1,通常指命令执行所回传的正确信息 ,默认输出到屏幕u。使用符号>或>>
标准错误:文件描述符2,通常指命令执行失败后,所回传的信息,也是默认输出到屏幕。试用符号2>或2>>
默认情况下>和>>分别表示1>或1>>,<和<<与0<和0<<等价。
标准输出重定向:
#ls
表示列出当前目录条目,并将结果输出到屏幕。
#ls 1>file1
以上命令会把命令的标准输出重新定向到一个文件file,而不是显示到屏幕上,如果不指明文件标识符,系统默认的就是1, 因此1可以省略。
即这个命令等同于
#ls >file1
如果file1不存在,则系统会自动创建。如果已经存在,那么系统首先会把这个文件清空,然后再将数据写入该文件。也就是说>输出到一个已存在的文件,那么会覆盖这个文件。如果不想覆盖,可以使用>>。表示将重定向数据追加到file1文件的末尾。
标准错误重定向:
#ls -qw 2>errorfile
表示将错误信息不输出到屏幕,而是写入errorfile。注意这里的2不能省略。因为>与1>等同,默认是标准输出重定向。所以这里要写成2>,表示标准错误重定向。-qw用来产生错误信息。
把标准错误和标准输出写入同一个文件:
#./a.out &>outfile
这个命令把./a.out的标准输出和标准错误重定向到outfile。&在这里表示标准错误和标准输出。下面是另一种写法:
#./a.out >outfile 2>&1
下面是一个错误的例子:
#./a.out >outfile 2>outfile
标准输入重定向:
#grep search-world <filename 或 grep search-world 0<filename
还有下面这种方式:
cat >catfile <~/.bashrc
它代表将~/.bashrc的内容作为输入,然后将这些内容写入catfile
关闭文件:
"&-"表示关闭文件标识符
有关关闭文件标识符的 *** 作请参考下面
n<&- 关闭输入文件标识符n
0<&-或<&- 关闭标准输入stdin
n>&- 关闭输出文件标识符n
1>&-或>&-关闭标准输出stdout
屏蔽标准输出或标准错误:
./a.out >/dev/null #等同于./a.out 1>dev/null 表示屏蔽标准输出
./a.out 2>/dev/null #表示屏蔽标准错误
./a.out >/dev/null 2>/dev/null#表示同时屏蔽标准输出和标准错误
打开文件:
#exec 3<>filename 把文件filename打开,并指定文件标识符为3
命令j<>filename表示把文件打开,并指明文件标识符为j
我们什么时候需要重定向:
1.屏幕输出的信息很重要,而且我们需要将它存下来的时候。
2. 后台执行中的程序,不希望它干扰屏幕正常的输出结果时。
3. 一些系统的例行命令。(例如写在/etc/crontab中的文件)的执行结果时,希望它可以存下来。
4. 一些执行命令的可能已知错误信息时,想以“2>dev/null"将它丢掉
5. 错误信息与正确信息需要分别输出时
常用重定向命令:
cmd >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 <file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;
cat <>file 以读写的方式打开 file;
cmd <file cmd 命令以 file 文件作为 stdin;
cmd <<delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符。
>&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;
<&n 标准输入复制自文件描述符 n;
<&- 关闭标准输入(键盘);
>&- 关闭标准输出;
n<&- 表示将 n 号输入关闭;
n>&- 表示将 n 号输出关闭;
与重定向相关的题目:
此题来自《unix环境高级编程》(第3版)P73 3.5
在Bourne shell、Bourne-again shell 和Korn shell中,digit1>&digit2表示将描述符digit1的重定向至描述符digit2的同一文件。请说明下面两条命令的区别。
./a.out >outfile 2>&1
./a.out 2>&1 >outfile
答:因为shell从左到右处理命令行,所以:
./a.out >outfile 2>&1 等同于./a.out 1>outfile 2>&1
首先执行 >outfile 设置标准输出到outfile,然后执行2>&1,即调用dup将标准输出复制到描述符2(标准错误上),其结果是将标准输出和标准错误设置为同一个文件,即描述符1和2指向同一个文件表项。而对于命令行
./a.out 2>&1 >outfile
首先执行dup,所以描述符2成为终端(假设命令是交互执行的),标准输出重定向到outfile。结果是描述符1指向outfile的文件表项,描述符2指向终端的文件表项。
参考资料:
1.http://os.51cto.com/art/201003/187688.htm
2.http://blog.csdn.net/ljianhui/article/details/9262737
3.https://www.ibm.com/developerworks/cn/linux/l-iotips/
4.《unix环境高级编程》
Linux 是什么 ?Linux 是一套 Unix-like 的 *** 作系统,是 Unix 的一种,它控制整个系统基本服务的核心程序 (kernel) 是由 Linus 带头开发出来的,「Linux」这个名称便是以「Linus's unix」来命名,Linus 选择用「大众公有版权」 (GPL)的方式来发行这份程序,这个版权允许任何人以任何形式复制与散布 Linux 的原始程序,换句话说,Linux 实际上是「免费的」,使用者在网络上就可以抓到 Linux 的原始程序代码,随心所欲的复制与更改 Linux 的原始程序,在因特网的日渐盛行以及 Linux 开放自由的版权之下,吸引了无数计算机高手投入开发、改善 Linux 的核心程序,使得 Linux 的功能日见强大,所以今日我们可以在网络上免费下载 Linux 使用,或者花很少的一点费用就可以取得 Linux 光盘,这都是因为 Linux 是 GPL 版权的缘故。
除了核心程序以外,一个 *** 作系统还需要其它的系统程序跟应用程序才有实用性,Linux 系统中常用的系统程序大部份是美国自由软件基金会 (Free Software Foundation) 开发出来的软件,而且也有不少机构或个人为 Linux 开发应用程序,这些程序一样大多都是自由软件,任何人都可以免费的在网络上取得,不过自行去取得这些程序再一一安装非常不便,于是有些公司或团体就会去搜集、整合 Linux 上的程序,把「核心-系统程序-应用程序」总合起来构成一个完整的 *** 作系统,让一般使用者可以简便的安装完整个系统,这就是所谓的「安装软件包」(distribution),我们一般讲的 Linux 系统便是针对这些安装软件包而言,同样是 Linux 系统,却分成不同公司、机构整合出来的不同安装软件包,这就是大家常常在网络上看到 Linux 有那么多「种」的原因。
Linux 具有 Unix 系统的程序接口跟 *** 作方式,也继承了 Unix 稳定有效率的特点。网络上安装 Linux 的主机连续运做一年以上而不曾当机、不必关机是稀松平常的事,不过 Linux 却不象一般 Unix 要负担庞大的版权费用,也不需要在专属的昂贵硬件上才可以使用;Linux 可以在一般的 i386 PC 上执行,效能又高,自然而然的接收了过去几十年来在 Unix 上累积的程序资源跟使用者,加上 GPL 的版权允许大家自由散布 Linux 的原始码,并针对自己的需求修改程序,使得 Linux 在目前已经成为非常受人欢迎的一个多人多任务、免费、稳定、效率高、可以在包括 i386、Sparc、Alpha、Mips、PPC 等众多不同计算机系统平台上执行的 *** 作系统。
Linux支持多种硬件装置,诸如x86、Motorola 68k、Digital Alpha、Sparc、Mips、Motorola PowerPC和ARM等等。由于程序代码公开,硬件厂商无须多付额外的版权费用,便得以替自行生产的硬件装置开发适用于Linux的驱动程序,提高产品销售率。
软 体方面,如X,为窗口系统的工业标准;另外,由理察·史托曼主导的Emacs,提供窗口版和文字版的文书编辑环境,功能复杂强大,有一套完整的在线说明档 案;而众人合作开发的SpreadSheet,是窗口版的电子表格,任何熟稔Lotus 1-2-3的人,看到这样丰硕的成果,都会有莫名的感动的。当然,最为人称道的,是Linux的网络能力,不论是SLIP、PPP、NetBEUI、 DDP、X.25还是ISDN等等,Linux都有相应的软件供应;而稳定的服务器功能,适用于架设Intranet和Internet。
一般用户受益于GNU GPL和LGPL的保护,可以不同的管道取得完整的Linux,故而Linux可以是「免费的(gratis)」。相对于Unix昂贵的版权费用,Linux称得上是物美价廉。
除此以外,Linux还具有如下的特色∶
· 具备多人多任务∶这表示Linux可以在同一段时间内服务许多人各别的需求。形象一点讲,你可以一边听铁达尼号的原声CD,一边编辑文书,一边又在打印档案,还可以随时玩X版的俄罗斯方块。
· 支持多CPU∶这绝对不是NT的专利,Linux也支持这种硬件架构,代表着更快速的运算和革命性的算法即将成为时代的主流。
· RAM保护模式∶程序(processes)之间不会互相干扰,保证系统能常久运作无误。根据许多人下载系统评量程序(benchmarks)以测试 Linux的执行效能,结果发现单单是配备486CPU的PC,效能便足堪媲美升阳(Sun)或是迪吉多的中级工作站了。
· 动态加载程序∶当程序加载RAM执行时,Linux仅将磁盘中相关的程序模块加载,有效地提升了执行的速率和RAM的管理。
· 动态连结共享程序馆∶这表示执行档的大小大量地减少,有助于节省磁盘空间。
· 支持多种档案系统∶如Minix、Xenix、System V等等著名的 *** 作系统。将来NT的NTFS也会列入支持的。
· 看得见DOS∶这是所谓的透明化(transparency);把DOS的FAT档案系统视为特殊的远程档案系统,不需任何特别的指令便可以灵活运用,就如同一个在Linux底下存在的目录一样。
Linux的发展
近几年的发展,已使得Linux成为微软、升阳的另一大敌手。Linux挟其价格低廉、品质良好与稳定的竞争优势,正无形无影地扩散至众多以PC为主的工作 平台上。早期因缺乏商业性应用软件,单凭学术味道浓厚的工具程序,是无法打入一般商家的主流 *** 作系统的。然而,今日的Linux已非吴下阿蒙,KDE、 Gimp、Gnome等计划相继地开展,为X提供了更多图形接口的桌面 *** 作环境和应用软件。
约1993年左右,Linux首先以发行软 体(distribution)的型态出现。这是一群完整的软件,包含安装程序、核心、应用软件、X、驱动程序等的软件包,经由Internet下载至磁 盘片进行安装。那时的安装程序简陋,难以成功地安装妥当,接口亲和力不足和硬件支持不良是最大的障碍。
后来出现了光驱,光盘片的传播媒体也应运而生,现今Linux厂商所制作的发行软件也都是以此为主要的发行媒介。国内常见的有Red Hat、Slackware和Debian这三种。其中以Debian算是至今仍维持非商业型态的重量级发行软件了,FSF曾经以基金援助过其初阶段的发展。任何人都可以从Debian的FTP站上下载整套的发行软件。当然,象Red Hat这样的商业组织,Red Hat发行软件一样也可以从FTP站上下载,不过如果花一点小钱买光盘片的话,就可以得到额外的技术支持和有用的说明档案。
要得到这些光盘片,最简单的方法便是买有关Linux的书籍,不论中文版或是英文版的书本,书背面都会附上一片载有该公司或组织所制作的发行软件。一般书内多会有专章讲解安装和设定的过程,读者可善加利用。不同的发行软件有不同的安装机制,然而都是Linux。
对国内用户而言,最关切的莫过于Linux中文技术的发展情况了。X窗口系统已有稳定的中文版问世,各种中文输入法和中文仿真窗口也已进入成熟的阶段,相信未来会朝向应用软件中文化的层面发展,使X的 *** 作环境符合国内用户的需求。
Linux的应用
没有商业活动,就没有Linux;没有信息自由的自觉,更不可能有Linux。
Linux除了是优良的软件开发平台之外,也是工作、家居的好伙伴。有人说∶「有了Linux,就等于有了阿拉神灯。」此言不假矣。又有人说∶「到现在还没有移植到Linux的软件,肯定是一点价值也没有的。」这话也不差呀。
Linux的发展证实了信息会愈来愈便宜的趋势;因为便宜,市场便无限扩张。商业活动也转向为以服务为导向的型态。最直接的案例便是ISP的应用。
Linux可以用来架设ISP!
Linux Journal的发行人SSC(Specialized System Consultants)便是以Linux做为网络拨接服务平台的。要成为ISP业者,需要有连接至因特网的能力,多序列阜拨接服务(如 Cycades、Maxspeed、Gtek等公司所提供的软件系统),PPP和SLIP的服务,Usenet新闻群组(如INN),邮件递送(如 sendmail),网页服务器(如Apache),备份功能(如tar、cpio)等等的应用软件。由此观察,主要的控制成本会落在因特网的通讯租费 上,投资Linux的费用是非常低的。
本文摘录自「 Official CLE 0.8 — 中文 Linux 延伸软件包使用指南
大力发展linux软件事业,有助于我国自主软件的开发,保护国家信息安全,并且在国际竞争中赢得一点份额
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)