是否有一个标准的Bash工具,其行为类似于echo,但输出到stderr而不是stdout?
我知道我可以做echo foo 1>&2,但它有点难看,而且,我怀疑,容易出错(例如,当事情发生变化时,更容易编辑错误)。
是否有一个标准的Bash工具,其行为类似于echo,但输出到stderr而不是stdout?
我知道我可以做echo foo 1>&2,但它有点难看,而且,我怀疑,容易出错(例如,当事情发生变化时,更容易编辑错误)。
当前回答
James Roth和Glenn Jackman建议的组合解决方案
添加ANSI颜色代码以红色显示错误消息:
echoerr() { printf "\e[31;1m%s\e[0m\n" "$*" >&2; }
# if somehow \e is not working on your terminal, use \u001b instead
# echoerr() { printf "\u001b[31;1m%s\u001b[0m\n" "$*" >&2; }
echoerr "This error message should be RED"
其他回答
如果您不介意将消息也记录到syslog,那么not_so_丑陋的方法是:
logger -s $msg
-s选项表示:“将消息输出到标准错误和系统日志。”
你可以这样做,这有助于阅读:
>&2 echo "error"
>&2将文件描述符#2复制到文件描述符#1。因此,执行此重定向后,两个文件描述符将引用同一个文件:最初引用的是一个文件描述符#2。有关更多信息,请参阅Bash Hackers Illustrated redirection Tutorial。
我的建议:
echo "my errz" >> /proc/self/fd/2
or
echo "my errz" >> /dev/stderr
echo“myerrz”>/proc/self/fd/2将有效地输出到stderr,因为/proc/self是当前进程的链接,/proc/sell/fd保存进程打开的文件描述符,然后,0、1和2分别代表stdin、stdout和stderr。
/proc/self链接在MacOS上不起作用,但是,/proc/self/fd/*在Android上的Termux上可用,但在/dev/stderr上不可用。如何从Bash脚本检测操作系统?如果您需要通过确定要使用的变量来使脚本更具可移植性,可以提供帮助。
制作脚本
#!/bin/sh
echo $* 1>&2
那将是你的工具。
或者,如果您不想在单独的文件中有脚本,则生成一个函数。
James Roth和Glenn Jackman建议的组合解决方案
添加ANSI颜色代码以红色显示错误消息:
echoerr() { printf "\e[31;1m%s\e[0m\n" "$*" >&2; }
# if somehow \e is not working on your terminal, use \u001b instead
# echoerr() { printf "\u001b[31;1m%s\u001b[0m\n" "$*" >&2; }
echoerr "This error message should be RED"