如何抑制以下错误
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 ...
首先重定向标准错误:
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 ,并在之后恢复read
(read
以便仍然能够报告读取错误(如果有))。