是否有一个标准的Bash工具,其行为类似于echo,但输出到stderr而不是stdout?
我知道我可以做echo foo 1>&2,但它有点难看,而且,我怀疑,容易出错(例如,当事情发生变化时,更容易编辑错误)。
是否有一个标准的Bash工具,其行为类似于echo,但输出到stderr而不是stdout?
我知道我可以做echo foo 1>&2,但它有点难看,而且,我怀疑,容易出错(例如,当事情发生变化时,更容易编辑错误)。
当前回答
制作脚本
#!/bin/sh
echo $* 1>&2
那将是你的工具。
或者,如果您不想在单独的文件中有脚本,则生成一个函数。
其他回答
由于1是标准输出,因此不必在输出重定向前显式命名它,如>。相反,您可以简单地键入:
echo This message goes to stderr >&2
由于您似乎担心1>&2对您来说很难可靠地打字,因此删除多余的1可能会对您有一点鼓励!
read是一个shell内置命令,可打印到stderr,可以像echo一样使用,而无需执行重定向技巧:
read -t 0.1 -p "This will be sent to stderr"
-t 0.1是一个超时,它禁用读取的主要功能,将一行stdin存储到变量中。
你可以这样做,这有助于阅读:
>&2 echo "error"
>&2将文件描述符#2复制到文件描述符#1。因此,执行此重定向后,两个文件描述符将引用同一个文件:最初引用的是一个文件描述符#2。有关更多信息,请参阅Bash Hackers Illustrated redirection Tutorial。
这是一个简单的STDERR函数,它将管道输入重定向到STDERR。
#!/bin/bash
# *************************************************************
# This function redirect the pipe input to STDERR.
#
# @param stream
# @return string
#
function STDERR () {
cat - 1>&2
}
# remove the directory /bubu
if rm /bubu 2>/dev/null; then
echo "Bubu is gone."
else
echo "Has anyone seen Bubu?" | STDERR
fi
# run the bubu.sh and redirect you output
tux@earth:~$ ./bubu.sh >/tmp/bubu.log 2>/tmp/bubu.err
不要像这里提到的那样使用猫。cat是一个程序而echo和printf是bash(shell)内置的。启动一个程序或另一个脚本(如上所述)意味着创建一个新的过程,并承担所有成本。使用内置函数,编写函数非常便宜,因为不需要创建(执行)进程(-environment)。
开场白询问“是否有任何标准工具可以输出(管道)到stderr”,简短的回答是:否。。。为什么?重定向管道是unix(Linux…)和bash(sh)等系统中的一个基本概念。
我同意开场白的观点,即用这样的符号重定向:&2>1对现代程序员来说不是很愉快,但这就是bash。Bash不是为了编写庞大而健壮的程序,而是为了帮助管理员以更少的按键完成工作;-)
至少,您可以将重定向放置在行中的任何位置:
$ echo This message >&2 goes to stderr
This message goes to stderr