管道到文件不适用于中间管道

Ale*_*lls 0 streaming pipe shell-script

这导致了问题:

node "$SUMAN_PROJECT_ROOT/server.js" | bunyan -o short &> ${LOG_FILE}  &
Run Code Online (Sandbox Code Playgroud)

这有效:

node "$SUMAN_PROJECT_ROOT/server.js"  &> ${LOG_FILE}  & 
Run Code Online (Sandbox Code Playgroud)

问题是使用第一个命令时,输出没有发送到文件。在第二个命令中,它确实被发送到文件。为什么第一个命令不起作用 - 我希望它会像第二个命令一样将输出发送到文件。bunyan 命令应该像 grep 一样,只是过滤和映射 node 命令的输出。

我的编辑不喜欢建议的解决方案:

在此处输入图片说明

Wil*_*ard 6

node "$SUMAN_PROJECT_ROOT/server.js"  &> ${LOG_FILE}  & 
Run Code Online (Sandbox Code Playgroud)

首先让我们检查一下工作命令。

这表示获取命令的标准输出和标准错误node,并将两者都重定向到日志文件。(并且您需要引用您的变量;如果 LOG_FILE 包含空格,它将中断。请参阅为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?

并且该命令被置于后台,&但这并不是真正相关的。

node "$SUMAN_PROJECT_ROOT/server.js" | bunyan -o short &> ${LOG_FILE}  &
Run Code Online (Sandbox Code Playgroud)

你说的这个命令不起作用。这样做是取标准只输出的node命令,并把它传递给bunyan命令,那么标准输出和标准错误重定向的的bunyan命令日志文件。

既然你说这不起作用,那么显而易见的结论是,你感兴趣的node命令输出被发送到它的标准错误,而不是它的标准输出。使用&|或使用node ... 2>&1 | ...所以标准错误也被重定向。

&|是一种bashism,不可移植,但&>我想你并不关心那个。)