我想知道是否有内置的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文件保持尽可能简单和干净,这意味着避免在文件中使用>
运算符。
答案 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()。