2009-11-03 167 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