o relógio corta a saída ps aux quando canalizado

5

Enquanto trabalho em um script (Python) que não tem nenhuma conseqüência aqui, eu me deparei com um comportamento muito estranho envolvendo watch e ps aux , quando o último é canalizado para outra coisa.

Consegui reduzir o problema para uma única linha. Quando executando

watch "ps aux | grep 'ps aux'"

em um terminal, você normalmente obtém várias linhas de saída, como esperado.

Observe que as três principais linhas estão cortadas e mal cabem ps aux no final. Quando você reduz o tamanho do seu terminal para onde ele não cabe mais, ele é cortado completamente dos resultados.

Isso significa que o grep recebe apenas a saída cortada. O que eu acho mais desconcertante nisso é o escopo extremamente limitado para o qual isso acontece. Isso não acontece para qualquer um dos

ps aux | grep "ps aux"
watch "ps u -C ps"
watch "ssh localhost 'ps aux | grep \"ps aux\"'"

Em todos esses casos, a lista é agrupada conforme o esperado.

Este parece ser o caso tanto para o bash quanto para o sh, no Ubuntu 15.04.

Embora eu tenha conseguido contornar esse problema no meu script, alguém tem uma explicação para esse comportamento?

    
por MrLemon 28.07.2015 / 11:24

1 resposta

4

Demônios nasais. 1

man ps diz (ênfase minha):

comm       COMMAND   command name (only the executable name).
                     Modifications to the command name will not be
                     shown.  A process marked  is partly
                     dead, waiting to be fully destroyed by its
                     parent.  The output in this column may contain
                     spaces.  (alias ucmd, ucomm).  See also the args
                     format keyword, the -f option, and the c option.
                     When specified last, this column will extend to
                     the edge of the display.  If ps can not determine
                     display width, as when output is redirected
                     (piped) into a file or another command, the
                     output width is undefined (it may be 80,
                     unlimited, determined by the TERM variable, and
                     so on).  The COLUMNS environment variable or
                     --cols option may be used to exactly determine
                     the width in this case.  The w or -w option may
                     be also be used to adjust width.

De fato, definir manualmente a variável COLUMNS ajuda:

watch "ps aux | grep 'ps aux'"

COLUMNS=2000 watch "ps aux | grep 'ps aux'"

1 Apesar de não estarmos falando de um compilador C ...

    
por muru 28.07.2015 / 13:10