协慌网

登录 贡献 社区

echo 输出到 stderr

是否有一个标准的 Bash 工具,它像 echo 一样输出到 stderr 而不是 stdout?

我知道我可以做echo foo 1>&2但它有点难看,我怀疑,容易出错(例如,当事情发生变化时更有可能被编辑错误)。

答案

这个问题很旧,但你可以做到这一点,这有助于阅读:

>&2 echo "error"

运算符>&2字面意思是将文件描述符 1( stdout )的地址重定向到该命令1 的文件描述符 2( stderr )的地址。根据您想要了解它的深度,请阅读: http//wiki.bash-hackers.org/howto/redirection_tutorial

为避免与其他重定向的交互,请使用 subshell

(>&2 echo "error")

1 >&2文件描述符# >&2复制到文件描述符#1。因此,在执行此重定向之后,两个文件描述符将引用相同的文件:一个文件描述符#2 最初是指。

你可以定义一个函数:

echoerr() { echo "$@" 1>&2; }
echoerr hello world

这比脚本更快,没有依赖性。

Camilo Martin 的 bash 特定建议使用 “here string” 并将打印传递给它的任何内容,包括 echo 通常会吞下的参数(-n):

echoerr() { cat <<< "$@" 1>&2; }

格伦杰克曼的解决方案也避免了吞咽问题:

echoerr() { printf "%s\n" "$*" >&2; }

由于1是标准输出,因此您不必在输出重定向(如>前面明确命名,而只需键入:

echo This message goes to stderr >&2

由于您似乎担心1>&2将难以可靠地键入,因此消除冗余1可能对您有点鼓励!