Bash的输入输出重定向

使用Bash可以方便的用<和>实现输出输入的重定向,本文讨论重定向的一些细节和技巧。本文介绍部分是对Bash Quick Reference相关内容的翻译。

目录

[隐藏]

基础知识

文件描述符(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<&nm来自文件描述各个n
cmd <&-关闭标准输入
cmd <&n-移动输入文件描述符n而非复制它。(需要解释)
cmd >&n-移动输出文件描述符 n而非复制它。(需要解释)
Note.gif
注意: 
>&实际上复制了文件描述符,这使得 ls > dirlist 2>&1ls 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校验工作。


应该允许输入来自以下两种方式:

  • 在命令行上指定的文件名。例如:

    $ command input_file

    在这个例子中,command 应该读取文件 input_file。

  • 标准输入(stdin),缺省情况下为终端(也就是用户的键盘)。例如:

    $ command

    这里,用户输入 Control-D(文件结束指示符)前输入的所有内容都成为 command 的输入。

但是,使用 shell 操作符“<”(重定向标准输入),也可将标准输入重定向为来自文件,如下所示:

$ command < input_file

这里,command 会读它的标准输入,不过 shell/内核已将其重定向,所以标准输入来自 input_file。

使用 shell 操作符“|”(pipe)也可以使标准输入来自另一个程序的标准输出,如下所示:

$ other_command | command

这里,other_command 的标准输出(stdout)被 shell/内核透明地传递至 command 的标准输入。

准则 2. 输出

输出应该被写至标准输出,缺省情况下标准输出同样也是终端(也就是用户的屏幕):

$ command

在这个例子中,command 的输出出现在屏幕上。

同样,使用 shell 操作符“>”(重定向标准输出)可以将标准输出重定向至文件。

$ command > output_file

这里,command 仍然写至它的标准输出,不过 shell/内核将其重定向,所以输出写至 output_file。

或者,还是使用“|”操作符,command 的输出可以成为另一个程序的标准输入,如下所示:

$ command | other_command

在这个例子中,shell/内核安排 command 的输出成为 other_command 的输入。

准则 3. 错误输出

错误输出应该被写至标准错误(stderr),缺省情况下标准错误同样也是终端(也就是用户的屏幕):

$ command

这里,运行 command 时出现的任何错误消息都将被写至屏幕。

但是使用标准错误重定向,也可以将错误重定向至文件。例如:

$ command 2>error_file

在这个例子中,command 的正常输出在屏幕显示,而任何错误消息都被写至 error_file。

可以将标准输出和标准错误都重定向至不同的文件,如下所示:

$ command >output_file 2>error_file

这里,将标准输出写至 output_file,而将所有写至标准错误的内容都写至 error_file。

如果已将标准输出重定向至某一位置,也可以将标准错误重定向至同一位置。例如:

$ command 2>&1

在这个例子中,符号“2>&1”表示“将标准错误发送至标准输出被重定向的任何位置”,因此错误和正常的消息都将在屏幕上显示。当然,这是多余的,因为下面简单的调用

$ command

将做同样的事。在标准输出已被重定向至其它源,而您希望在同一命令行上将标准错误也写至同一目的地时,该特性就非常有用。例如:

$ command >output_file 2>&1

在这个例子中,已首先将标准输出重定向至 output_file;因此“2>&1”将使标准错误也被重定向至 output_file。


* /script/myscript.sh 1> /dev/null 2>&1
其中 1> /dev/null 2>&1是什么意思??
dev/null 为系统垃圾箱
&为后台运行
但是 myscript 后面的1 和 /null后面的2 还有 &后面的1是什么意思?
1代表标准输出,2代表错误信息输出.
1>/dev/null 就是指将标准输出定向到空设备,
2>&1,的意思是将错误输出定向到和1一样的输出设备,也同样是空.
换句话说,就是不显示该程序执行过程中的任何信息


cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开
他们的不同点在于:
cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
而cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率更高。

in UNIX 
0 = stdin 
1 = stdout 
2 = stderr 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值