重定向错误 *来自重定向操作本身*
Redirecting errors *from redirection operations themselves*
假设我在当前目录中有一些名为 a.txt 的文件。它的 chmod 值为 000.
因此,如果我尝试写入它,我会得到以下输出:
> printf "Hello" >> a.txt
-bash: a.txt: Permission denied
我怎样才能抑制这个输出?我已经尝试将 2>/dev/null
附加到我的命令中,但是这种重定向似乎并没有像我最初希望的那样工作。
重定向是按顺序计算的,因此要抑制消息,您必须在尝试重定向标准输出之前重定向标准错误:
printf "Hello" 2> /dev/null >> a.txt
是正确的,如果你还想抑制错误 来自你正在 运行ning 的命令,而不仅仅是来自开始前执行的重定向它。
如果您只想抑制来自重定向本身的消息,而不是抑制来自实际执行的错误消息,那么您需要一对额外的重定向,以临时存储原始信息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>&-
删除备份,保留文件描述符 table,就像我们什么都不做一样。 (通常将其排除在外是安全的——大多数行为良好的程序将简单地忽略非标准文件描述符的初始值,除非明确告知要这样做)。
假设我在当前目录中有一些名为 a.txt 的文件。它的 chmod 值为 000.
因此,如果我尝试写入它,我会得到以下输出:
> printf "Hello" >> a.txt
-bash: a.txt: Permission denied
我怎样才能抑制这个输出?我已经尝试将 2>/dev/null
附加到我的命令中,但是这种重定向似乎并没有像我最初希望的那样工作。
重定向是按顺序计算的,因此要抑制消息,您必须在尝试重定向标准输出之前重定向标准错误:
printf "Hello" 2> /dev/null >> a.txt
如果您只想抑制来自重定向本身的消息,而不是抑制来自实际执行的错误消息,那么您需要一对额外的重定向,以临时存储原始信息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>&-
删除备份,保留文件描述符 table,就像我们什么都不做一样。 (通常将其排除在外是安全的——大多数行为良好的程序将简单地忽略非标准文件描述符的初始值,除非明确告知要这样做)。