2009-11-03 192 views
13

我正在嘗試寫一個bash腳本,我很難使輸出看起來整潔有序。我可以重新使用換行符,但我寧願讓輸出易於閱讀。例如,當我運行git clone ...時,我想首先回顯「克隆存儲庫」,然後輸出git縮進。示例輸出:縮進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. 

當前,它全部壓縮而沒有縮進。有誰知道如何做到這一點?我試圖用sedawk,但它似乎沒有顯示出比Initialized empty Git repository in /root/client_scripts/jojo/.git/更多的輸出。我會非常感謝任何意見。

回答

5

通過任何命令管道GIT中的輸出的問題是git會檢測到輸出不是終端,所以它不會輸出進度信息,因爲(典型情況下)將一大堆終端字符和進度更新傳送到非終端的東西是沒有用的。

無論如何,要獲取進度消息,您需要提供--verbose選項git clone。進度消息出現在stderr上,所以您可能需要一個類似2>&1 | ...的管道。

請注意進度信息​​不會逐行顯示,但您會得到很多用於清除同一行的終端轉義碼。試圖通過像sed這樣基於行的工具來管道縮進這個輸出可能很難,如果不是不可能的話。對於可以無緩衝地處理輸入的程序,應該很有可能在輸出中尋找^M並立即添加一些空格(或選項卡),並且每接收一批數據時都會頻繁地刷新。

+1

感謝您的信息,但是,我的git版本(1.5.6.5)和最新版本都沒有--version作爲git或git-clone的選項。如果我想要這樣做,我想我簡直是失敗了。感謝有關git檢測到它不在終端上的信息。 – 2009-11-04 14:54:19

+0

Err ...我剛剛重讀了我以前的評論,我的確意味着'--verbose'而不是'--version'。 – 2009-11-05 15:16:15

42

管通過

sed "s/^/ /g" 

這將通過四個空格,在該行的開始有效加入四個空格替換爲線開始(零寬度)錨。

(在G中這個全球;沒有它,它只會做一次,它會做的第一行。)

+0

如果這是你想要的,你也可以在其中放置一個字面製表符。 – 2009-11-03 22:38:13

+0

我已經嘗試過,不幸的是,它只輸出第一行(「Initialized empty ...」)。我的猜測是其餘的信息被輸出到STDERR,但我似乎無法弄清楚如何重定向它。 – 2009-11-03 22:39:18

+0

使用I/O重定向來捕獲STDERR – 2009-11-03 22:41:28

5

可以過濾來自你想通過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> 

sed命令將替換行(第一個字符之前)的用製表開始時,即在該行的最開始插入一個製表。

更新爲也縮進stderr。

+0

不幸的是,這並沒有捕獲git的必要輸出。仍然只輸出第一行... – 2009-11-03 22:54:49

5

一種不同的解決方案,它不需要的sed:

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

您錯過了讀取變量;修正:'命令|同時閱讀REPLY;做回聲「$ REPLY」;完成' – 2009-11-03 23:05:18

+3

@Ryan Bright:不,閱讀Bash手冊,隱含REPLY變量。或者只需在shell中輸入並自行測試。 – Juliano 2009-11-04 00:23:12

2

由於AWK溶液不貼尚未:

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