Você está tentando preservar a cabeça do comando PS (assim você pode ver os cabeçalhos), mas mostra apenas os comandos vlc
.
Eu pessoalmente usaria apenas awk
e filtrar com base em duas condições, o número da linha e o VLC. Se um deles for verdadeiro, nós geramos a linha:
$ ps aux | awk 'NR==1 || ~/vlc/'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
oli 4833 0.6 0.2 795220 62952 ? Sl 15:37 0:00 /usr/bin/vlc
Tem a vantagem adicional de estar executando apenas ps
uma vez. E como o campo 11 é o comando principal (não qualquer um dos seus argumentos), também não capturaremos o comando awk
que está sendo executado. Acabamos de obter o VLC e os cabeçalhos das colunas.
Em uma barra lateral, algo como isso deve funcionar ... mas não ...
ps aux | tee >(head -1 >&2) | grep vlc
Você estava perto, você precisava canalizar para o último comando ou tee
vai se desentender sobre STDOUT, e se você enviar para STDOUT e depois para pipe, é provável que ele seja capturado no último grep
. No acima, eu imprimo os cabeçalhos em STDERR (2) para impedir que grep
interfira nele. Bit hacky mas hey-ho.
Mas sim, isso ainda não funciona . O motivo é que head
fecha o STDOUT , que filtra de volta para tee
e detém o grep
. Isso ocorre por design, portanto, head
não processa mais entradas do que o necessário. Você pode simular o que está fazendo com awk
:
$ ps aux | tee >(awk 'NR==1 {print;exit}' >&2) | grep "grep"
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
Isso é equivalente a head -1
. Ele encontra a primeira linha e depois sai. Isso elimina o buffer de entrada e tee
falha.
Aqui está uma versão em que awk
não sai depois de encontrar a primeira linha. Vai continuar correndo (coisa boa ou não) sobre cada linha:
$ ps aux | tee >(awk 'NR==1' >&2) | grep "grep"
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
oli 15103 0.0 0.0 11752 2236 pts/18 S+ 11:32 0:00 grep --color=auto grep
Outra alternativa é enviar a entrada para sponge
. O Sponge absorve todo o fluxo de entrada antes de gravá-lo em um arquivo (ou ser redirecionado). Isso impede que a cabeça elimine o fluxo pai, mas significa que a entrada será invertida (o grep
será a saída primeiro), então vamos passar por uma instância sponge
também:
$ ps aux | tee >(sponge >(head -1 >&2)) | sponge >(grep "grep")
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
oli 14875 0.0 0.0 11752 2192 pts/18 S 11:19 0:00 grep --color=auto grep
Mas enquanto esses dois segundos funcionam, e você está gerando apenas ps aux
de saída, eles ainda têm sérios problemas . O awk|grep
está processando tudo duas vezes e o sponge
orgy está armazenando tudo duas vezes.
tl; dr : Se você puder processar tudo em um comando como você pode com awk
, por que você não faria isso?