Как передать все выходные данные терминала через команду

Я хотел бы иметь возможность передавать все команды терминала bash через определенную команду (без веской причины, кроме как разыграть кого-то). Я просто хочу передать стандартный вывод любой выполненной команды в заранее определенную программу, не делая ничего особенного.

Например: если эта предопределенная программа была cowsay

echo "Hello World"

должен выводить

 _____________
< Hello World >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Как мне этого добиться? (Некоторые из забавных программ, которые я хотел бы использовать, чтобы разыграть других, включают rev, cowsay, а также lolcat)

1 ответ

Решение
exec > >(COMMAND)

куда COMMAND является rev, lolcat или другой. Это не будет работать с cowsay,

Например

bash-4.3$ exec > >(rev)
bash-4.3$ echo hello
olleh

Объяснение:

  • exec обычно заменяет текущую оболочку другим процессом, но если вы просто дадите ей перенаправление, как в этом случае, перенаправление будет иметь место для текущей оболочки.
  • > перенаправить стандартный вывод
  • >(COMMAND) вход в COMMAND

Обратите внимание, что если у вас есть PROMPT_COMMANDВы должны направить его в stderr, чтобы избежать перенаправленного stdout.

Другие вопросы по тегам