bash - 重定向错误*来自重定向操作本身*
问题描述
假设我在当前目录中有一些名为 a.txt 的文件。它的 chmod 值为 000。
因此,如果我尝试写入它,我会得到以下输出:
> printf "Hello" >> a.txt
-bash: a.txt: Permission denied
我怎样才能抑制这个输出?我已经尝试附加2>/dev/null
到我的命令,但这种重定向似乎没有像我最初希望的那样工作。
解决方案
如果您还想抑制正在运行的命令的错误,而不仅仅是在启动它之前执行的重定向,那么其他人的答案是正确的。
如果您只想抑制来自重定向本身的消息,而不是抑制来自实际执行的错误消息,那么您需要一对额外的重定向来临时存储 stderr 的原始值,以便以后恢复它:
printf "Hello" 3>&2 2>/dev/null >>a.txt 2>&3 3>&-
这分解如下:
3>&2
将原始 stderr (FD 2) 复制到默认情况下未使用的文件描述符 (FD 3),创建原始目标的备份。2>/dev/null
然后将 stderr 指向/dev/null
.>>a.txt
将 stdout (FD 1)aa.txt
指向 , stderr 指向/dev/null
.2>&3
将我们在 FD 3 上的备份复制回 FD 2,将 stderr 恢复到其原始目标,以便正在运行的程序可以记录错误。3>&-
删除备份,保留文件描述符表,如果我们什么都不做的话。(通常可以安全地忽略这一点——大多数表现良好的程序会简单地忽略非标准文件描述符的初始值,除非明确告知要这样做)。
推荐阅读
- redis - Redis 配置设置会在几个小时后动态更改
- c# - 如何使用同时实现 IDisposable 和 IAsyncDisposable 的类型?
- delphi - Delphi 5 BPL 不只链接一个程序
- rest - 如果基于 cookie 的身份验证与 REST API 一起使用,那么相同的 API 如何用于移动应用程序?
- java - 尝试使用 Apache Gobblin 使用 SOAP API 而非 REST API 读取 Salesforce 数据
- scala - 如何根据参数有条件地构造案例类?
- javascript - Formik 添加新的值数组,而不是仅添加值
- c# - 无法重定向 路由表中没有与提供的值匹配的路由。在 MVC 5 中
- python - asyncio 的默认调度程序何时公平?
- actions-on-google - 合并来自多个 webhook 请求的简单响应的错误