如何通过命令管道所有 bash 终端输出

vik*_*mun 6 command-line bash pipe cowsay

我希望能够通过某个命令传输所有 bash 终端命令(除了对某人恶作剧之外,没有其他充分的理由)。我只想将任何已执行命令的标准输出通过管道传输到预先确定的程序中,而无需做任何特别的事情。

例如:如果该预定程序是 cowsay

echo "Hello World"
Run Code Online (Sandbox Code Playgroud)

应该输出

 _____________
< Hello World >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?(一些有趣的节目,我想用它来恶作剧别人包括revcowsaylolcat

wja*_*rea 7

exec > >(COMMAND)
Run Code Online (Sandbox Code Playgroud)

COMMANDrevlolcat或其他。这不适用于cowsay.

例如

bash-4.3$ exec > >(rev)
bash-4.3$ echo hello
olleh
Run Code Online (Sandbox Code Playgroud)

解释:

  • exec 通常用另一个进程替换当前 shell,但如果你只是给它一个像这种情况下的重定向,重定向将发生在当前 shell。
  • > 重定向标准输出
  • >(COMMAND) 输入到 COMMAND

请注意,如果您有PROMPT_COMMAND,则应将其定向到 stderr 以避免重定向的 stdout。

  • @wjandrea 也许来自`expect` 的 [`unbuffer`](http://expect.sourceforge.net/example/unbuffer.man.html) 命令可能会有所帮助。 (2认同)