Shell 中重定向 `2 > &1` 的使用

一 相关知识

  1. 默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |)。
  2. 默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(backquotes `)。
  3. 默认地,标准的错误输出到终端,但是也可以重定向到文件。
  4. 标准的输入,输出和错误输出分别表示为 STDIN,STDOUT,STDERR,也可以用 0,1,2 来表示。
  5. 其实除了以上常用的 3 中文件描述符,还有 39 也可以作为文件描述符。39 你可以认为是执行某个地方的文件描述符,常被用来作为临时的中间描述符。

二 实例

  1. command 2>errfile : command 的错误重定向到文件 errfile。
  2. command 2>&1 | ...: command 的错误重定向到标准输出,错误和标准输出都通过管道传给下个命令。
  3. var=command 2>&1` : command 的错误重定向到标准输出,错误和标准输出都赋值给 var。
  4. command 3>&2 2>&1 1>&3 | ...:实现标准输出和错误输出的交换。
  5. var=command 3>&2 2>&1 1>&3``:实现标准输出和错误输出的交换。
  6. command 2>&1 1>&2 | ... (wrong...):这个不能实现标准输出和错误输出的交换。因为 shell 从左到右执行命令,当执行完 2>&1 后,错误输出已经和标准输出一样的,再执行 1>&2 也没有意义。

三 “2>&1 file”和 “> file 2>&1”区别

  1. cat food 2>&1 >file :错误输出到终端,标准输出被重定向到文件 file。
  2. cat food >file 2>&1 :标准输出被重定向到文件 file,然后错误输出也重定向到和标准输出一样,所以也错误输出到文件 file。

四 注意

通常打开的文件在进程推出的时候自动的关闭,但是更好的办法是当你使用完以后立即关闭。用 m<&-来关闭输入文件描述符 m,用 m>&-来关闭输出文件描述符 m。如果你需要关闭标准输入用<&-; >&- 被用来关闭标准输出。

五 同时输出到终端和文件

copy source dest | tee.exe copyerror.txt

六 参考

1)http://docstore.mik.ua/orelly/unix/upt/ch45_21.htm
2)http://www.unix.com/shell-programming-scripting/34011-meaning-dev-null-2-1-a.html
3)http://docstore.mik.ua/orelly/unix/upt/ch08_13.htm

原文: https://www.cnblogs.com/fjping0606/p/4573517.html

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.