A construção mais simples seria:
(command1 ; command1.1) | command2 | command3
Existem dois problemas potenciais com isso. Se command1.1
produzir qualquer saída no stdout, ela será enviada pelo pipe. Além disso, command2
não verá EOF no stdin até que command1.1
seja concluído.
Se o pipeline for invocado inicialmente em um contexto onde os descritores de arquivo stdout e stderr estão apontando para a mesma estrutura de arquivo, então existe uma maneira simples de corrigir os dois problemas:
(command1 ; exec 1>&2 command1.1) | command2 | command3
Isso fará com que o stdout do comando1.1 aponte para stderr, que não foi redirecionado pelo pipeline.
Se inicialmente stdout e stderr podem ser dois descritores de arquivo diferentes, a abordagem acima pode ser usada temporariamente armazenando o stdout inicial em outro número de descritor de arquivo. Então, a menos que você realmente precise manter o stdout e o stderr de command1.1
separados, eu não usaria essa abordagem.
Para completar, se você quisesse fazer isso, poderia ser assim:
(((exec 9>&- command1) ; exec 1>&9 9>&- command1.1) | exec 9>&- command2 | exec 9>&- command3) 9>&1