代码之家  ›  专栏  ›  技术社区  ›  Salman Arshad

在stderr上打印消息的bash命令

  •  9
  • Salman Arshad  · 技术社区  · 15 年前

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

    编辑----

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

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

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

    6 回复  |  直到 10 年前
        1
  •  11
  •   Dennis Williamson    15 年前

    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
    
        2
  •  3
  •   Jürgen Hötzel    15 年前

    没有内置,可以使用:

    function echo-err { echo "$@" >&2; }
    
        3
  •  2
  •   Chris Cooper    15 年前

    您还可以创建别名。

    alias echoerr='echo >&2'
    
        4
  •  2
  •   nic ferrier    10 年前

    没有人提到过,但您也可以这样做:

    echo An error message > /dev/stderr

    它可能比 >&2 但这要看你是谁。

        5
  •  1
  •   user unknown    15 年前

    只是一个旁注:如果你想演示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)中起作用。

        6
  •  0
  •   Personman    15 年前

    一般来说,我认为“临时IO重定向”和您想要的东西之间并没有真正的区别。stderr和其他任何类型的文件描述符一样,它是一个文件描述符,任何执行您所希望的操作的内置设备在内部执行的操作与您通过重定向echo(如jurgen上面建议的)所做的相同,即对其调用write()。