在 shell 下区分 stdout 和 stderr 的两种思路

2009/08/07 | 15:19 | 分类:Linux与开源 | 标签: | 4,085次阅读

  1.使用命名管道重定向。在一个终端中新建命名管道,将标准错误重定向到此管道文件;在另一个终端中读取管道输出:

  1. linjian@goslin:~/dev/outerr$ cat ./test1.sh
  2. #!/bin/bash
  3.  
  4. while true; do
  5.     echo "Input: "
  6.     read FOO
  7.     echo "I am in stdout, $FOO"
  8.     echo "I am in stderr, $FOO" >&2
  9. done
  10. linjian@goslin:~/dev/outerr$ mkfifo mypipe
  11. linjian@goslin:~/dev/outerr$ ./test1.sh 2> ./mypipe
  12. Input:
  13. Hello World
  14. I am in stdout, Hello World
  15. Input:
  1. linjian@goslin:~/dev/outerr$ cat ./mypipe
  2. I am in stderr, Hello World

  也可以使用 Emacs 等在同一屏内显示两个终端。
 
  2.使用匿名管道处理标准输出。由于标准错误不会进入管道,因此不会被管道后面的程序处理。例如使用“tr”来改变标准输出的大小写。

  1. linjian@goslin:~/dev/outerr$ ./test1.sh | tr [a-z] [A-Z]
  2. INPUT:
  3. Hello World
  4. I am in stderr, Hello World
  5. I AM IN STDOUT, HELLO WORLD
  6. INPUT:

  想要更明显一点的话,可以用 ANSI 颜色特性,自己写一个简单的过滤器:

  1. linjian@goslin:~/dev/outerr$ cat color.sh
  2. #!/bin/bash
  3.  
  4. while true; do
  5.     read FOO
  6.     echo -e "\E[33;44m$FOO\E[37;40m"
  7. done

  或者直接使用像 ansi-color 这样的现成工具。