bash - 回显到 stderr 并将 stderr 输出到文件
问题描述
我正在尝试将输出回显到 stderr 并将 stderr 同时重定向到文件,我注意到重定向的顺序很重要,但我不明白为什么必须这样。
asap
使用以下任一命令,该文件为空:
echo "Fatal error." >&2 2>asap
echo >&2 "Fatal error." 2>asap
但这有效,将“致命错误”记录到文件asap
中。
echo "Fatal error." 2>asap >&2
为什么?
解决方案
有关大多数必需信息,请参阅如何通过管道传输 stderr 而不是 stdout。请特别注意“相反”的评论。请记住,所有重定向都在命令执行之前完成,并且重定向是从左到右处理的。(管道稍微复杂化了这个故事。大多数时候,标准输出的管道重定向在任何其他重定向之前完成。例外是 Bash 特定的语法,|&
请阅读 Bash手册了解详细信息 - 然后不要使用|&
.)
请注意,重定向可以位于命令行上相对于命令名称和参数的任何位置。那是:
<html> xml some -command
是相同的
some -command <html >xml
等等。因此,问题中的前两个命令之间没有区别。(我认为你自己发现了这一点。)
问题中的第一个命令:
echo "Fatal error." >&2 2>asap
首先将标准输出重定向到当前的标准错误,然后将标准错误重定向到文件(让标准输出指向原来的标准错误),然后执行echo
命令。该消息转到原始标准错误(您的终端),而不是文件,因为echo
不写入标准错误。
最后一条命令:
echo "Fatal error." 2>asap >&2
首先将标准错误发送到文件,然后将标准输出发送到标准错误要去的地方(文件),然后执行echo
命令。由于标准输出将发送到文件,因此终端上看不到任何内容。
推荐阅读
- javascript - 如何在点击时按类延迟加载图像?
- java - 如何在我的计算机中找到 android.support.v7 库的位置?
- firebase-cloud-messaging - 如何修复“无效注册”FCM
- php - 更新 SQL 查询未执行
- nginx - 如何调试和修复 nginx 错误的位置重定向问题?
- javascript - 尽管存在但格式无效,但无法从 cookie 中获取键值
- android - 手机处于睡眠模式时,Socket.Io 客户端断开连接
- swift - 如何一次从多个位置删除一个密钥 firebase 数据库?
- .net - 错误 MSB4057:项目中不存在目标“Build”
- java - 为什么'BackgroundFetchHeadlessTask.java'在离子中不起作用?