本文共 3485 字,大约阅读时间需要 11 分钟。
是否有一个标准的工具,它像echo一样输出到stderr而不是stdout?
我知道我可以做echo foo 1>&2
但它有点难看,我怀疑,容易出错(例如,当事情发生变化时更有可能被编辑错误)。
由于1
是标准输出,因此您不必在输出重定向(如>
前面明确命名,而只需键入:
echo This message goes to stderr >&2
由于您似乎担心1>&2
将难以可靠地键入,因此消除冗余1
可能对您有点鼓励!
另外一个选项
echo foo >>/dev/stderr
read
是一个shell内置命令,可以打印到stderr,并且可以像echo一样使用而不执行重定向技巧:
read -t 0.1 -p "This will be sent to stderr"
-t 0.1
是一个超时,它禁用read的主要功能,将一行stdin存储到一个变量中。
你可以这样做,这有助于阅读:
>&2 echo "error"
>&2
文件描述符# >&2
复制到文件描述符#1。 因此,在执行此重定向之后,两个文件描述符将引用相同的文件:一个文件描述符#2 最初是指。 有关更多信息,请参阅 。
如果您不介意将消息记录到syslog中,则not_so_ugly方式为:
logger -s $msg
-s选项表示:“将消息输出到标准错误以及系统日志。”
不要使用cat
因为这里提到的一些。 cat
是一个程序,而echo
和printf
是bash(shell)内置的。 启动程序或其他脚本(也在上面提到)意味着创建一个包含所有成本的新流程。 使用内置函数,编写函数非常便宜,因为不需要创建(执行)进程(-environment)。
opner问“是否有任何标准工具输出( 管道 )到stderr”,schort答案是:NO ...为什么? ... rediredcting管道是像unix(Linux ...)和bash(sh)这些概念的系统中的一个元素概念。
我赞同用这样的符号重定向的开场白: &2>1
对现代程序员来说不是很愉快,但那是bash。 Bash并不打算编写庞大而强大的程序,它旨在帮助管理员用更少的按键来完成工作;-)
至少,您可以将重定向放在行中的任何位置:
$ echo This message >&2 goes to stderr This message goes to stderr
不,这是执行此操作的标准方法。 它不应该导致错误。
制作一个剧本
#!/bin/shecho $* 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; }
Mac OS X:我尝试了接受的答案和其他几个答案,所有这些答案导致在我的Mac上写STDOUT而不是STDERR。
以下是使用Perl写入标准错误的可移植方法:
echo WARNING! | perl -ne 'print STDERR'
注意:我正在回答帖子 - 而不是误导/模糊的“输出到stderr的回声”问题(已经由OP回答)。
使用函数来显示意图并获得所需的实现。 例如
#!/bin/bash[ -x error_handling ] && . error_handlingfilename="foobar.txt"config_error $filename "invalid value!"output_xml_error "No such account"debug_output "Skipping cache"log_error "Timeout downloading archive"notify_admin "Out of disk space!"fatal "failed to open logger!"
而error_handling
是:
ADMIN_EMAIL=root@localhostconfig_error() { filename="$1"; shift; echo "Config error in $filename: $*" 2>&1; }output_xml_error() { echo "$* " 2>&1; }debug_output() { [ "$DEBUG"=="1" ] && echo "DEBUG: $*"; }log_error() { logger -s "$*"; }fatal() { which logger >/dev/null && logger -s "FATAL: $*" || echo "FATAL: $*"; exit 100; }notify_admin() { echo "$*" | mail -s "Error from script" "$ADMIN_EMAIL"; }
处理OP问题的原因:
其他原因:
这已经得到了很好的回答。 仅供记录:
echo "my errz" > /proc/self/fd/2
将有效输出到stderr
。 说明: /proc/self
是当前进程的链接,而/proc/self/fd
包含进程打开的文件描述符。 然后, 0
, 1
,和2
代表stdin
, stdout
和stderr
分别。
我发现它更具可读性。 这也适用于大多数Linux分发:
echo "my errz" > /dev/stderr
使它更具可读性。
我最近偶然发现的另一个选择是:
{ echo "First error line" echo "Second error line" echo "Third error line" } >&2
这只使用Bash内置函数,同时使多行错误输出不易出错(因为您不必记住在每行中添加&>2
)。
这是一个简单的STDERR函数,它将管道输入重定向到STDERR。
#!/bin/bash# *************************************************************# This function redirect the pipe input to STDERR.## @param stream# @return string#function STDERR () {cat - 1>&2}# remove the directory /bubuif rm /bubu 2>/dev/null; then echo "Bubu is gone."else echo "Has anyone seen Bubu?" | STDERRfi# run the bubu.sh and redirect you outputtux@earth:~$ ./bubu.sh >/tmp/bubu.log 2>/tmp/bubu.err
转载地址:http://daogj.baihongyu.com/