En Unix, ¿cómo obtengo el resultado del command diff para que parezca una página man? ¿Dónde puedo presionar 'b' o 'f' para leer más o volver?

Ya sabes cómo cuando usas el command man para leer el manual (por ejemplo, man ls ) y obtienes un resultado que está paginado que puedes leer de arriba abajo presionando 'f' para leer más abajo y 'b' para leer más arriba (asumiendo que está leyendo de arriba a abajo de izquierda a derecha) y presiona 'q' para salir. Quiero que la salida de diff se comporte de la misma manera porque a veces tengo una larga list de diferencias para leer, pero me veo obligado a desplazarme hacia arriba en el terminal para leer el comienzo de la salida.

El command diff de Git hace esto y me ha gustado (por ejemplo, git diff ) pero no siempre tengo el lujo de tener todos mis files bajo control de versión.

Lo mejor que puedo pensar es conectar la salida del command diff con algún otro command, pero no estoy seguro de cuál. ¿Alguien puede ayudar? ¿Este tipo de comportamiento de salida proporcionado (como las páginas man) tiene un nombre para reference futura?

Se llama "salida de pagination" o (algo erróneamente) "pagination" …

… y el man hace invocando su command preferido de pager shell, nombrado por su variable de entorno PAGER , en la salida de cualquier canalización que se utilizó para generar el formulario de salida de la página de manual. Se vuelve a un valor pnetworkingeterminado si no ha especificado un command de buscapersonas. En las primeras Unices, el progtwig de buscapersonas pnetworkingeterminado, que el man invoca como el command pnetworkingeterminado de buscapersonas con opciones conocidas cableadas, era pg . En su sistema, probablemente sea more o less . Algunos commands man miran otras variables de entorno para los commands del buscapersonas.

Lo haces haciendo lo que hace el man : canaliza la salida de lo que quieres ver en la input estándar de un progtwig de pagination.

Deberías conseguirte un buen libro en Unix. Hay unos pocos que explican esto, que es una característica muy básica del sistema. Una búsqueda simple de Google Libros para pager unix more por mí hoy, reveló más de cien libros que discuten esto. (Dejé de contar a cien).

El progtwig auxiliar que man y git diff invoke se llama pager . En los sistemas modernos, el buscapersonas pnetworkingeterminado se llama less . Hace varias décadas, el primer buscapersonas era more , llamado así porque mostraba una página y luego esperaba que presionas una tecla para ver "más". Luego vino less , lo que también te permite regresar (ver less, por así decirlo), confirmando el dicho de que "less es más" (que más).

git diff es un poco una exception; la utilidad diff , el subcommand cvs diff , el subcommand svn diff y demás simplemente hacen su trabajo de calcular el diff e imprimirlo. Si desea desplazarse por el diff, necesita invocar un buscapersonas explícitamente:

 diff file.old file.new | less 

Si desea utilizar un localizador diferente para man , git diff y otros commands que llaman a un localizador, puede establecer la variable de entorno PAGER , por ejemplo, colocando esto en el file ~/.profile :

 export PAGER=most 

No puede hacer que los commands como diff invoquen un buscapersonas automáticamente. Sin embargo, puede hacer una function de envoltura (para poner en su file de initialization de shell, por ejemplo, ~/.zshrc para zsh o ~/.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 } 

Advertencia: tal function puede ser perjudicial a veces. También puede crear un alias de un carácter para su buscapersonas, por ejemplo

 alias p=less P=less 

para que pueda escribir diff … |p o diff … |P cuando quiera recorrer la salida de un command.

¿Qué hay de usar el command less … EX:

  ls -l | less -CM 

Puedes ver el contenido de diff en vim:

 git diff | view - 

Por supuesto que puede:

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

¡Disfrutar!