如何重定向${var:?”foo"} 语法的 stderr?

如何重定向${var:?”foo"} 语法的 stderr?

我正在使用 bash,并且如果未使用以下命令设置变量,则尝试将消息打印到标准错误:

echo ${var:?"This var is not set"}

现在,我想将该错误消息重定向到文件。我尝试了以下操作,但没有成功:

echo ${var:?"This var is not set"} > testfile

以下方法也不起作用:

echo ${var:?"This var is not set"} 2> testfile

那么,我如何才能将该生成的消息定向到文件?

答案1

Bash 参考手册

${parameter:?word}

如果parameter为空或未设置,则将扩展word(或如果不存在则显示该信息word)写入标准错误,并且如果 shell 不是交互式的,则退出。否则,parameter将替换的值。

这可能不太明显,但这里的“标准误差”指的是标准误差壳的。当您这样做时,echo … 2> testfile您将重定向标准错误echo。它们通常都会出现在您的终端中,但并不相同。

为了使它按你想要的方式工作,创建子 shell 并重定向它是标准错误:

(echo ${var:?"This var is not set"}) 2> testfile

这也行得通:

{ echo ${var:?"This var is not set"}; } 2> testfile

请注意,实际命令 ( echo) 将继承子 shell 已重定向的标准错误,因此实际上此重定向会影响它们两者。命令何时返回错误消息几乎无关紧要,echo但对于返回错误消息的命令,情况确实如此。比较:

unset var
(dd ${var:?"This var is not set"}) 2> testfile
cat testfile
var=foo
(dd ${var:?"This var is not set"}) 2> testfile
cat testfile

相关内容