Ultimamente, tenho experimentado o ps
comando e, às vezes, caminhos longos são agrupados na próxima linha (ou duas) e dificultam a leitura. Quero canalizar a ps
saída para outro programa para limitar a saída ao x
número de caracteres.
Aqui está o que tenho até agora, mas não funciona muito bem:
ps aux | cut -c1-$(stty size | cut -d' ' -f2)
$(stty size | cut -d' ' -f2)
é avaliado como 167, mas não parece ser uma entrada válida para cut
.
Existe uma maneira de obter esse tipo de sintaxe para trabalhar no bash?
tput rmam; ps aux
zsh
,ksh93
oubash
armazenar a largura terminal$COLUMNS
Respostas:
Os seguintes trabalhos:
Isso também funciona:
O problema parece ser que
stty
precisa ter o tty em sua entrada padrão para funcionar. As duas abordagens acima resolvem isso.Ainda existe outra opção. Enquanto
stty
stdin e stdout são redirecionados nos comandos acima, seu stderr não é: ainda aponta para um terminal. Estranhamente,stty
também funcionará se receber stderr como entrada:fonte
tee
foi adicionado quando eu estava depurando. Agora se foi.<&2
significa obter sua entrada do erro padrão.stty
abre as configurações do terminal em seu stdin (você fazstty < /dev/other-tty
para obter as configurações de outro terminal, por exemplo). Portanto, não é estranho que não funcione se o seu stdin for um cachimbo ou se<&2
funcionar.Alguns escudos gosto
zsh
,bash
oumksh
automaticamente definir a$COLUMNS
variável para a largura do terminal, para que você não precisa invocarstty
aqui.Todas as implementações de
ps
que tentei que suportam essa sintaxe não padrão (tipo BSD) consultam a largura do terminal por si próprias. Estou surpreso que o seu não. Espero que ele analise o conteúdo da variável deCOLUMNS
ambiente .Então você poderia fazer:
Se não,
Você também pode dizer ao seu terminal para não quebrar as linhas:
fonte
Você também pode lidar com a
ps
saída um pouco melhor.Isso indicará
ps
para analisar sua saída com suas especificações, conforme necessário.É claro que, se você não usar quebra de linha, terá o problema de perder informações. Você realmente precisa de tudo isso para todos os processos? Abra-o em um pager, se houver:
Caso contrário, especifique o que você deseja ver:
Como alternativa, você pode informar explicitamente sobre o
ps
seu terminal--width
:A
--width
coisa funciona exatamente com as especificações solicitadas, sem a necessidade de envolver filtros adicionais ou processos auxiliares (o que provavelmente sobrecarregará-aux
ainda mais a sua saída). E com$COLUMNS
como mostrado acima e como Stephane aponta, ele funcionará dinamicamente.Provavelmente é importante notar, porém, que acho que as pessoas muitas vezes tentam adicionar estes tipos de filtros desnecessários para que possam acomodar um
|pipe
através de outro filtro para a saída de análise que é também bastante provável que seja desnecessário. Claro, pelas pessoas eu principalmente me refiro .O
-o
operando utput que mencionei acima permite filtrar quais colunas sãops
exibidas e, quando você adiciona a=
atribuição, pode até nomear a coluna como desejar. Deixo a atribuição vazia e entregá-lo um alvo-p
rocess$pid
então a única saídaps
em tudo é o$pid
nome do comando e suaargs
a invocação. E-o
mal arranha a superfície de como você pode definir o queps
será ou não exibido. Esta é a direção que eu recomendo que você tome, especialmente via:fonte