Bash:如何将标准输出发送到控制台并通过管道发送到下一个命令?

Bash:如何将标准输出发送到控制台并通过管道发送到下一个命令?

如何将标准输出发送到控制台并同时通过管道发送到下一个命令?

我已经尝试使用此处建议的 Read 命令,该命令可以将 Grep 的输出从日志文件的尾部获取到变量,然后获取到日志或电子邮件,但我仍然希望将输出获取到标准输出控制台还有: https://unix.stackexchange.com/a/365222/346155

我尝试过使用 Tee,如下所示: https://unix.stackexchange.com/a/47936/346155

我使用 --line-buffered 标志以防万一: https://stackoverflow.com/a/7162898/4240654

我可能遗漏了一些关于 sdtin 逻辑的简单内容,但第一个链接的情况表明 Bash 可能不具备这种简单的功能。并且该变量无法从子 shell 中读取。

有效的事实echo 'hello' | echo $(</dev/stdin)表明它是可能的。另一种看待它的方法是,如何在每个管道段内进行标准输出到控制台。这应该有助于在将一长串命令提交到 bash 脚本之前对其进行调试。

编辑:类似echo 'hello' | echo $(</dev/stdin) >/dev/stoutor 的东西echo 'hello' | tee >/dev/stdout | echo 2nd $(</dev/stdin),后者应该输出 'hello' 两次,但只输出一次。

答案1

使用tee /dev/tty。例子:

echo "Hello word" | tee /dev/tty | wc -c

tee/dev/tty是 POSIX 所要求的。


/dev/tty2一般来说,您可以使用类似或 的名称/dev/pts/7。它不必是当前终端,只要您可以写入即可。

另一种看待它的方法是,如何在每个管道段内进行标准输出到控制台。这应该有助于在将一长串命令提交到 bash 脚本之前对其进行调试。

我已经用tmux窗格方便地做了类似的事情。您可以使用或不使用 来执行此操作tmux

  1. 根据需要准备尽可能多的窗格;或控制台窗口,如果您愿意的话。
  2. 在每次调用中tty了解终端的文件名。
  3. 其中之一调用您想要调试的管道,tee并在每个步骤中使用不同的终端。这条管道

    command1 | command2 | command3
    

    会变成类似的东西

    command1 | tee /dev/pts/4 | command2 | tee /dev/pts/5 | command3
    

    其中/dev/pts/4/dev/pts/5是附加终端(例如 中的窗格tmux)。

答案2

... | tee log-file-name

这将获取第一个命令的标准输出并复制到日志文件和标准输出。

相关内容