如何抑制文件重定向错误

Gab*_*iel 2 shell

如何抑制以下错误

if true </dev/tty 2>/dev/null; then
   read -r "$VARIABLE" </dev/tty
fi
Run Code Online (Sandbox Code Playgroud)

似乎没有忽略错误can't open /dev/tty: No such device or address。这就是整个 if 子句的目的。错误发生在if ...

Sté*_*las 5

首先重定向标准错误:

if true  2>/dev/null </dev/tty; then
   IFS= read -r "$VARIABLE" </dev/tty
fi
Run Code Online (Sandbox Code Playgroud)

使用zsh,您需要:

if { true </dev/tty; } 2> /dev/null; then
   IFS= read -r "$VARIABLE" </dev/tty
fi
Run Code Online (Sandbox Code Playgroud)

与重定向失败一样,zsh 在输出错误消息之前恢复 fds(这对我来说很有意义,但这意味着行为不一致,因为在重定向外部命令时不会发生恢复)。

假设您想从进程的控制 tty 设备读取一行(如果有的话)。

但这与

IFS= read -r "$VARIABLE" 2> /dev/null </dev/tty
Run Code Online (Sandbox Code Playgroud)

如果/dev/tty无法打开,read则不会运行命令(此处)。

你也可以这样做:

{ IFS= read -r "$VARIABLE" < /dev/tty 2>&3 3>&-; } 3>&2 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

对于要/dev/null/dev/tty打开之前重定向到的 stderr ,并在之后恢复readread以便仍然能够报告读取错误(如果有))。