我正在使用 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
${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