假设我在当前目录中有一个名为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
将标准输出 (FD 1( 指向aa.txt
,标准指向/dev/null
。2>&3
将FD 3上的备份复制回FD 2,将stderr恢复到其原始目标,以便正在运行的程序可以记录错误。3>&-
删除备份,保留文件描述符表,如果我们什么都不做。(通常可以安全地省略这一点 - 大多数行为良好的程序只会忽略非标准文件描述符的初始值,除非明确告知要这样做(。
重定向按顺序进行评估,因此要禁止显示消息,您必须在尝试重定向 stdout之前重定向 stderr:
printf "Hello" 2> /dev/null >> a.txt