2009-11-03 22 views
13

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 hacer un eco de "Repositorio de clonación" y luego hacer sangrar el resultado de git. Ejemplo de salida:Indenting Bash Script Output

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 solo Initialized empty Git repository in /root/client_scripts/jojo/.git/. Agradecería mucho cualquier comentario.

Respuesta

5

El problema con tubería de la salida de git a través de cualquier comando se ese git detectará que la salida no es un terminal, por lo que no emitirá mensajes que son mensajes de progreso porque (típicamente) no es útil canalizar una gran cantidad de caracteres de terminal y actualizaciones de progreso a algo que no es un terminal.

Para obtener los mensajes de progreso de todos modos, debe proporcionar la opción --verbose al git clone. Los mensajes de progreso aparecen en stderr, por lo que es probable que necesite una tubería como 2>&1 | ....

Tenga en cuenta que los mensajes de progreso no aparecerán línea por línea, pero obtendrá muchos códigos de escape de 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 programa que pueda manejar la entrada sin búfer, debería ser bastante posible buscar 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.

+1

Gracias por la información, sin embargo, ni mi versión de git (1.5.6.5) ni la última tienen --version como una opción para git o git-clone. Supongo que simplemente no tengo suerte si quiero hacer esto. Gracias por la información sobre detectar git que no está en una terminal. –

+0

Err ... Acabo de volver a leer mi comentario anterior, realmente quise decir '--verbose' not' --version'. –

42

tubo a través

sed "s/^/ /g" 

Esto reemplazará el ancla (anchura de cero) para la puesta en línea de cuatro espacios, añadiendo efectivamente cuatro espacios en el inicio de la línea.

(g El hace esto a nivel mundial; sin él, sólo lo hará una vez, lo que haría la primera línea.)

+0

Podría poner un carácter de tabulación literal allí también, si eso es lo que quiere. –

+0

Ya lo he intentado, desafortunadamente, solo muestra la primera línea ("Initialized empty ..."). Supongo que el resto de la información se envía a STDERR, pero parece que no puedo descubrir cómo redirigirla. –

+0

Utilice la redirección de E/S para capturar STDERR –

5

puede filtrar la salida del comando 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 comando sed reemplazará al principio de la línea (antes de que el primer carácter) con un tabulador, es decir, insertar un tabulador al principio de la línea.

Actualizado a también indent stderr.

+0

Desafortunadamente, esto no captura la salida necesaria de git. Aún solo muestra la primera línea ... –

5

Una solución diferente que no requiere sed:

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

Falta la variable de lectura; corregir: 'comand | mientras lees RESPUESTA; hacer eco "$ REPLY"; hecho ' –

+3

@Ryan Bright: No, lea el manual Bash, la variable RESPUESTA está implícita. O simplemente escribe esto en un caparazón y pruébalo tú mismo. – Juliano

2

Dado que la solución awk no fue publicada aún:

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