如何在NuShell中将stderr重定向到文件?已尝试多方案未生效
在NuShell中捕获并保存stderr到文件的正确方法
问题分析
你之前的操作未成功有两个核心原因:
- 测试命令未实际产生stderr:
open fileList.json | from json中,fileList.json是通过ls | to json生成的合法JSON,from json不会抛出错误,自然没有stderr输出。 - NuShell的管道默认仅传递stdout,内部命令的stderr不会进入管道流,因此直接用
| save --stderr无法捕获上游命令的stderr。
正确实现方式
方式1:使用2>重定向符号(推荐)
NuShell支持类POSIX的重定向语法,直接用2>将命令的stderr写入文件:
# 制造一个会产生stderr的命令:将非JSON字符串转为JSON echo "invalid json" | from json 2> error.log
验证:打开error.log就能看到from json抛出的解析错误。
如果需要同时保存stdout和stderr到不同文件:
# stdout写入out.log,stderr写入error.log some-command > out.log 2> error.log
方式2:使用capture命令捕获所有输出
capture命令可以同时捕获命令的stdout、stderr和退出码,之后你可以提取stderr部分保存:
# 捕获命令的输出,提取stderr并保存 (capture { echo "invalid json" | from json }).stderr | save error.log
关于save --stderr参数的说明
save的--stderr参数不是用来捕获上游命令的stderr,而是将save命令自身的错误输出写入指定文件。比如当save没有权限写入文件时,它的错误会被写入--stderr指定的路径,而非捕获上游的错误。
修复help save中的示例错误
你遇到的do i {}语法错误是因为命令写错了,正确的语法是用do { ... }包裹代码块:
do { echo "test" } | save foo.txt --stderr foo.txt
不过这个示例本身是展示save自身的错误输出,比如如果foo.txt是只读文件,save的写入错误会被写入--stderr指定的路径。
内容的提问来源于stack exchange,提问作者Robert Ranjan
相关产品推荐
相关产品推荐

