No Unix, como obtenho a saída do comando diff para parecer uma man page? Onde eu posso pressionar 'b' ou 'f' para ler mais ou para trás?

6

Você sabe como usar o comando man para ler o manual (por exemplo, man ls ) e obtém uma saída paginada que pode ser lida de cima para baixo pressionando 'f' para ir mais abaixo e 'b' 'ler mais acima (supondo que você está lendo de cima para baixo da esquerda para a direita) e pressione' q 'para sair. Eu quero que a saída do diff se comporte da mesma maneira, porque às vezes eu tenho uma longa lista de diferenças para ler, mas eu me vejo tendo que rolar todo o caminho no terminal para ler o início da saída.

O comando Git diff faz isso e eu cheguei a gostar dele (por exemplo, git diff ), mas nem sempre tenho o privilégio de ter todos os meus arquivos sob controle de versão.

O melhor que posso pensar é canalizar a saída do comando diff para algum outro comando, mas não tenho certeza de qual. Alguém pode ajudar? Esse tipo de comportamento de saída fornecido (como man pages) tem um nome para referência futura?

    
por racl101 17.11.2011 / 20:44

4 respostas

11

É chamado de "saída de paginação" ou (um pouco erroneamente) "paginação"…

… e man fazem isso chamando o comando shell de pager preferido, nomeado por sua variável de ambiente PAGER , na saída de qualquer pipeline usado para gerar o formulário de saída da página de manual. Ele volta a um padrão se você não especificou um comando de pager. No início Unices, o programa pager padrão, que man chama como o comando pager padrão com opções conhecidas, era pg . Em seu sistema, provavelmente é more ou less . Alguns comandos man também examinam outras variáveis de ambiente para comandos de pager.

Você faz isso fazendo o que o man está fazendo: canaliza a saída do que você quer ver na entrada padrão de um programa pager.

Você deve conseguir um bom livro sobre o Unix. Há alguns poucos que explicam isso, que é uma característica muito básica do sistema. Uma simples pesquisa do Google Livros para pager unix more por mim revelou mais de cem livros sobre isso. (Eu parei de contar a cem.)

    
por 17.11.2011 / 21:53
9

O auxiliar do programa que man e git diff invocar é chamado de pager . Nos sistemas modernos, o pager padrão é chamado less . Várias décadas atrás, o primeiro pager era more , assim chamado porque exibia uma página e aguardava que você pressionasse uma tecla para ver "mais". Então veio less , que também permite que você volte (para ver menos, por assim dizer), confirmando o ditado que "menos é mais" (do que mais).

git diff é um pouco de exceção; o utilitário diff , o subcomando cvs diff , o subcomando svn diff e assim por diante fazem seu trabalho de calcular o diff e imprimi-lo. Se você quiser paginar através do diff, você precisa invocar um pager explicitamente:

diff file.old file.new | less

Se você quiser usar um pager diferente para man , git diff e outros comandos que chamam um pager, você pode definir a variável de ambiente PAGER , por exemplo, colocando isso no arquivo ~/.profile :

export PAGER=most

Você não pode fazer comandos como diff invocar um pager automaticamente. No entanto, você pode criar uma função de wrapper (para colocar no arquivo de inicialização do seu shell, por exemplo, ~/.zshrc para zsh ou ~/.bashrc para bash):

diff () {
  if [ -t 1]; then             # If standard output is a terminal
    command "$@" | less        #    then pipe through less
  else                         # else
    command "$@"               #     run the command (and return its exit status)
  fi
}

Atenção: essa função pode ser prejudicial às vezes. Você também pode criar um alias de um caractere para seu pager, por exemplo,

alias p=less P=less

para que você possa digitar diff … |p ou diff … |P quando quiser percorrer a saída de um comando.

    
por 18.11.2011 / 11:50
4

Que tal usar o comando less ... EX:

 ls -l | less -CM
    
por 17.11.2011 / 20:56
1

Você pode ver o conteúdo do diff no vim:

git diff | view -

Claro que você pode:

diff -u a.txt b.txt | view -

Aproveite!

    
por 18.11.2011 / 05:46

Tags