2009-11-03 14 views
13

Próbuję napisać skrypt basha i mam problem z wygladem wydruku i porządku. Mogę zrezygnować z używania nowych linii, ale wolałabym mieć wydruki łatwe do odczytania. Na przykład, kiedy uruchamiam git clone ..., chcę najpierw wywołać echo "Repozytorium klonowania", a następnie wprowadzić wynik git z wcięciem. Przykładowa moc wyjściowa:Wcięcie wyjściowego wyniku skryptu Bash

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. 

Obecnie całość jest skompresowana bez wcięcia. Czy ktoś wie, jak to zrobić? Próbowałem z sed i awk, ale wydawało się, że nie wyświetlają więcej wyników niż tylko Initialized empty Git repository in /root/client_scripts/jojo/.git/. Byłbym bardzo wdzięczny za wszelkie uwagi.

Odpowiedz

5

Problem z rurami wyjście GIT każdym poleceniem jest ten git wykryje, że wyjście nie jest terminalem, więc nie będzie wysyłało komunikatów, które są komunikatami postępu, ponieważ (zazwyczaj) nie jest użyteczne wyprowadzanie wielu znaków terminala i aktualizowanie postępu do czegoś, co nie jest terminalem.

Aby uzyskać wiadomości o postępach, musisz podać opcję --verbose na git clone. Komunikaty o postępie pojawiają się na stderr, więc prawdopodobnie potrzebujesz rury podobnej do 2>&1 | ....

Pamiętaj, że komunikaty o postępie nie pojawią się linia po linii, ale otrzymasz wiele kodów ewakuacyjnych, które mają na celu wyczyszczenie tej samej linii. Próba wprowadzenia wcięcia tego wyniku za pomocą narzędzia opartego na linii, takiego jak sed, może okazać się trudna, a nawet niemożliwa. W przypadku programu, który może obsługiwać wejście niebuforowane, powinno być całkiem możliwe wyszukanie na wyjściu numeru ^M i dodanie spacji (lub karty) bezpośrednio po sobie, przepłukując tak często, jak każda partia danych.

+1

Dziękuję za informację, jednak ani moja wersja git (1.5.6.5), ani najnowsza wersja --version nie jest opcją dla git ani git-clone. Sądzę, że po prostu nie mam szczęścia, jeśli chcę to zrobić. Dzięki za informację o git wykrywanie, że nie jest na terminalu. –

+0

Err ... Po prostu ponownie przeczytałem mój poprzedni komentarz, naprawdę miałem na myśli '--verbose' not' --version'. –

42

rur przez

sed "s/^/ /g" 

ten zastąpi (zerowej szerokości) kotwicy na początku linii czterech miejscach, skuteczne dodanie czterech miejsc na początku linii.

(The g robi to w skali globalnej; bez niego, będzie to zrobić tylko raz, co zrobić w pierwszej linii).

+0

Możesz tam umieścić literalną postać tabulatora, jeśli tego chcesz. –

+0

Próbowałem już tego, niestety, wyprowadza tylko pierwszy wiersz ("Inicjowany pusty ..."). Domyślam się, że pozostałe informacje są wysyłane do STDERR, ale nie mogę wymyślić, jak je przekierować. –

+0

Użyj przekierowania we/wy do przechwytywania STDERR –

5

można filtrować wyjście z polecenia chcesz wciąć przez 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> 

Polecenie SED wymienić początek linii (przed pierwszym znakiem) z tabulator, to znaczy umieścić tabulatora na początku linii.

Zaktualizowano do stentu z wcięciem.

+0

Niestety, nie przechwytuje to niezbędnych danych wyjściowych z git. Wciąż wyprowadza tylko pierwszą linię ... –

5

Innym rozwiązaniem, które nie wymagają sed:

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

Brakuje zmiennej odczytu; Napraw: 'comand | podczas czytania ODPOWIEDŹ; wykonaj echo "$ REPLY"; done ' –

+3

@Ryan Bright: Nie, przeczytaj instrukcję Bash, domniemana jest zmienna REPLY. Lub po prostu wpisz to w powłoce i przetestuj ją dla siebie. – Juliano

2

awk ponieważ roztwór nie był jeszcze wysłane:

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