在stderr上打印消息的Bash命令

时间:2010-04-15 06:27:38

标签: linux bash shell

我想知道是否有内置的BASH命令在stderr上打印一些文本,就像在stdout上打印文本的echo命令一样。我不想使用临时的io重定向。我使用内置命令在stderr上生成错误,例如ls --asdf(ls:unrecognized选项'--asdf'),但我想要更整洁的东西。

编辑----

实际上我正在尝试演示stderr / stdout重定向,我的示例如下:

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

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

没有内置,你可以使用:

function echo-err { echo "$@" >&2; }

答案 2 :(得分:2)

您也可以制作别名。

alias echoerr='echo >&2'

答案 3 :(得分:2)

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

echo An error message > /dev/stderr

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

答案 4 :(得分: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是系统上bash的链接,它也会检查它的调用方式(arg0)并将sh调用视为调用

bash --posix 

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

答案 5 :(得分:0)

一般来说,我认为“临时io重定向”和你想要的东西之间并没有什么区别。 stderr是一个像任何其他文件描述符一样的文件描述符,任何你想要的内置函数都可以在内部做同样的事情,你可以通过重定向回声来完成Jurgen上面提到的,即在它上面调用write()。