Sangría Bash Script Output

Estoy intentando escribir un script bash y estoy teniendo dificultades para hacer que el resultado se vea limpio y organizado. Podría volver a utilizar líneas nuevas, pero preferiría tener una salida que fuera fácil de leer. Por ejemplo, cuando ejecuto git clone ... , primero quiero repetir "Repositorio de clonación" y luego hacer git la salida de git . Ejemplo de salida:

 Cloning repository... Initialized empty Git repository in /root/client_scripts/jojo/.git/ remote: Counting objects: 130, done. remote: Compressing objects: 100% (121/121), done. remote: Total 130 (delta 13), reused 113 (delta 6) Receiving objects: 100% (130/130), 176.07 KiB, done. Resolving deltas: 100% (13/13), done. 

Actualmente, está todo comprimido sin indentación. ¿Alguien sabe como hacer esto? Intenté con sed y awk pero no pareció mostrar más salida que Initialized empty Git repository in /root/client_scripts/jojo/.git/ . Agradecería mucho cualquier comentario.

El problema de conectar la salida de git a través de cualquier command es que git detectará que la salida no es un terminal, por lo que no emitirá posts que son posts de progreso porque (típicamente) no es útil canalizar un montón de caracteres de terminal y el progreso se actualiza a algo que no es un terminal.

Para get los posts de progreso de todos modos, debe proporcionar la opción --verbose a git clone . Los posts de progreso aparecen en stderr por lo que es probable que necesite un conducto como 2>&1 | ... 2>&1 | ...

Tenga en count que los posts de progreso no aparecerán línea por línea, pero obtendrá muchos códigos de escape de la terminal que están diseñados para borrar la misma línea. Es probable que resulte difícil, si no imposible, tratar de sangrar esta salida por medio de una herramienta de línea como sed. Para un progtwig que puede manejar la input sin búfer, debería ser bastante posible search un ^M en la salida y agregar algunos espacios (o una pestaña) inmediatamente después, enjuagando tan a menudo como se recibe cada lote de datos.

Pasar por

 sed "s/^/ /g" 

Esto replaceá el anclaje (de ancho cero) para el inicio de línea por cuatro espacios, agregando efectivamente cuatro espacios al comienzo de la línea.

(El g lo hace globalmente, sin él, solo lo hará una vez, lo que haría la primera línea).

Puede filtrar la salida del command que desea sangrar a través de sed.

 /tmp/test>cat script #!/bin/sh echo "Running ls -l" ls -l 2>&1 | sed 's/^/\t/' /tmp/test>sh script Running ls -l total 4 -rw-rw-r-- 1 hlovdal hlovdal 55 2009-11-03 23:36 script /tmp/test> 

El command sed replaceá el comienzo de la línea (antes del primer carácter) con un tabulador, es decir, inserta un tabulador al principio de la línea.

Se actualizó también para sangrar stderr.

Una solución diferente que no requiere sed:

 command | (while read; do echo " $REPLY"; done) 

Dado que la solución awk aún no se publicó:

 $ echo -en "hello\nworld\n" hello world $ echo -en "hello\nworld\n" | awk '{print " "$0}' hello world