【问题标题】:Bash command that prints a message on stderr在 stderr 上打印消息的 Bash 命令
【发布时间】:2010-04-15 06:27:37
【问题描述】:

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

编辑----

其实我是想演示stderr/stdout重定向,我的例子如下:

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

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

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    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
    

    【讨论】:

    • 您可能需要添加:if (argc &gt; 1) fprintf (stderr, "\n"); 以防止在未提供输入时将新行换行到stderr
    • @DavidC.Rankin:我认为这是个好主意。但是,就目前而言,它会在没有参数时输出一个换行符,就像echo 一样。
    • 是的,我也看到了,但我想如果我们正在做一些定制的事情,我们可以让它工作得更好:) 我测试了两种方式,我喜欢在这种情况下抑制换行没有输入。其他人可能喜欢空白行。
    【解决方案2】:

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

    echo An error message > /dev/stderr

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

    【讨论】:

    • 显然,您给出了最简单、最易读的答案。
    • 绝对正确,可读性最强,但出于可能的历史原因,(悲惨的)&gt;&amp;2 是惯用的 shell 形式。
    【解决方案3】:

    没有内置,你可以使用:

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

    【讨论】:

      【解决方案4】:

      你也可以做一个别名。

      alias echoerr='echo >&2'
      

      【讨论】:

      • 这不适用于echoerr foo 2&gt; test-err.txt,因为别名已扩展,然后同时设置了两个重定向,而第二个不知道第一个已设置。脚本中应避免使用别名 - 改用函数。
      【解决方案5】:

      只是一个旁注:如果你想演示 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】:

        总的来说,我认为“临时 io 重定向”和您想要的东西之间没有真正的区别。 stderr 和其他任何文件描述符一样是一个文件描述符,任何做你想做的事情的内置函数都会在内部做同样的事情,就像上面 Jurgen 建议的那样,通过重定向 echo 来做同样的事情,即在其上调用 write()。

        【讨论】:

          猜你喜欢
          • 2015-12-12
          • 1970-01-01
          • 1970-01-01
          • 2022-01-04
          • 2020-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多