2010-04-15 31 views
8

我想知道是否有一个内置的BASH命令在stderr上打印一些文本,就像在标准输出上打印文本的echo命令一样。我不想使用临时的io重定向。我使用内置命令在stderr上生成一个错误,例如ls --asdf(ls:无法识别的选项'--asdf'),但我想要一些更整洁的东西。在stderr上打印一条消息的Bash命令

编辑----

其实我试图证明标准错误/标准输出重定向和我的例子是这样的:

sh test.sh >test-out.txt 2>test-err.txt 

为清楚起见,我想保持test.sh文件简单和干净尽可能,这意味着在文件中避免>运算符。

回答

11

echo something >&2是做你想做的事的正确方法。

但是......

这将创建一个小程序,将回显它的参数stderr

gcc -o echoerr -x c - <<'EOF' 
#include <stdio.h> 
#include <stdlib.h> 
void main(int argc, char **argv) { 
    int i; 
    for (i = 1; i < argc; i++) { 
     fprintf(stderr, "%s ", argv[i]); 
    } 
    fprintf(stderr, "\n"); 
    exit(0); 
} 
EOF 

您可以使用它像这样:

$ ./echoerr this is an error message 
this is an error message 
$ ./echoerr this is an error message 2>error.out 
$ cat error.out 
this is an error message 
+0

您可能需要添加:'if(argc> 1)fprintf(stderr,“\ n”);'当没有给定输入时防止杂散换行到'stderr'。 – 2014-08-18 21:59:12

+0

@DavidC。Rankin:我认为这是个好主意。然而,就目前而言,当没有参数以'echo'的方式出现时,它会输出一个换行符。 – 2014-08-18 22:34:59

+0

是的,我也看到了这一点,但我想如果我们做了一些自定义的事情,我们可以使它更好地工作在一个垃圾箱:)我测试了两种方法,并且我喜欢在没有输入的情况下抑制换行。其他人可能喜欢空行。 – 2014-08-19 00:31:53

2

没有内置的,你可以使用:

function echo-err { echo "[email protected]" >&2; } 
0

在一般情况下,我觉得确实没有“临时IO重定向”和你想要的东西之间的差异。 stderr是一个像其他任何文件描述符,并且任何内建的做你想做的事都只是在内部做同样的事情,你可以像上面提到的Jurgen重定向echo那样做,即在它上面调用write()。

1

你也可以做一个别名。

alias echoerr='echo >&2' 
+0

这对于'echoerr foo 2> test-err.txt'不起作用,因为别名被扩展,所以两个重定向都被设置在同一时间,而第二个不知道第一个被设置了然而。在脚本中应该避免使用别名 - 而不是使用函数。 – 2014-08-18 22:41:20

1

只是一个旁注:如果你喜欢演示bash,你应该使用bash,而不是sh:

sh test.sh >test-out.txt 2>test-err.txt 
bash test.sh >test-out.txt 2>test-err.txt 

即使SH是来砸你的系统上的一个链接,它会检查它是如何调用(arg0中)和治疗SH-调用像调用

bash --posix 

导致有时微妙的不同的行为。一个常见的错误,如shebangs#/ bin/sh',但它确实在shell中工作(这是/ bin/bash)。

1

没有人提到这一点,但你也可以这样做:

echo An error message > /dev/stderr

它比>&2可能更具可读性,但我想这取决于你是谁。