Como a outra resposta não está sendo clara sobre isso, o outro (outro) caminho é
exec 3>&1
ls | sort | tee /dev/fd/3 | rev > /tmp/output
O exec 3>&1
dup licates descritor de arquivo 1 (stdout) como descritor de arquivo 3.
Em seguida, tee /dev/fd/3
grava uma cópia da saída de sort
nesse descritor de arquivo.
Isso deve funcionar em qualquer shell, mas pode depender do sistema operacional.
Uma variante que deve ser independente do sistema operacional, mas é bash
-specific é:
exec 3>&1
ls | sort | tee >( cat >&3 ) | rev > /tmp/output
Em bash
, >(command)
fornece um identificador de arquivo
para um pipe para um processo executando command
.
Em qualquer shell (?), command >&fd
executa command
com seu stdout redirecionado para o descritor de arquivo especificado,
que deve ter sido previamente estabelecido.
Uma versão mais complicada, que deve funcionar em qualquer sistema * nix (Posix), é
pipe_to_stdout=$(mktemp -u)
mkfifo "$pipe_to_stdout"
cat "$pipe_to_stdout" &
ls | sort | tee "$pipe_to_stdout" | rev > /tmp/output
rm "$pipe_to_stdout"
que é praticamente o mesmo que o segundo exemplo
(o cat
lê o fifo e escreve para stdout),
mas usando menos fumaça e espelhos no nível da casca.
Note que estas respostas são flexíveis
em que você poderia escrever a saída do ls
para a saída padrão
apenas reorganizando os comandos.