在shell脚本中缩进多行输出


76

我正在尝试在Ubuntu Amazon EC2框上更改当天消息(MOTD),以便在我输入SSH时它将显示我的目录之一的git状态。

所有默认MOTD文件的输出在每一行的开头都有两个空格,因此看起来很缩进,但是由于我的git status输出跨越了几行,因此如果我echo -n " "之前这样做,它只会缩进第一行。

知道如何缩进每一行吗?

Answers:


124

用管道将sed其插入到每行开头的2个空格。

git status | sed 's/^/  /'

我不知道如何解决该问题,但这有一个小问题。该函数的退出代码被破坏,sed在某些情况下可能会成为问题。
cglacet

@cglacet每当您将一个命令传递给另一个命令时,都是如此。如果有问题,可以将输出重定向到文件或变量,测试退出状态,然后处理保存的输出。
Barmar

@cglacetset -euo pipefail在脚本的第二行中指定将为您进行测试。
Acumenus

44

以@Barmar的答案为基础,这是一种更简洁的方法:

indent() { sed 's/^/  /'; }

git status | indent
other_command | indent

1
并没有真正增加太多,这只是shell脚本中的一个用例,所以bash子例程有点过大了,但是谢谢
Matt Fletcher 2015年

2
@MattFletcher:好吧,我认为像这样编写带有子例程的代码可以使非bash教授(例如我自己)更容易发现正在发生的事情。另外,如果您决定突然想拥有3个空格而不是2个空格,则只有一个位置可以更正。
Vering

2
@Vering是正确的,而且我确实知道这样做的好处,我只是在暗示它本来可以是评论,而不是答案本身,因为它几乎是相同的答案,并且可以解决从未在文档中提出的问题。第一名:)
马特·弗莱彻

@MattFletcher:好的,您可能对评论和回答有一点看法
Vering 2015年

3
请记住,我正在提供备用代码段。在没有给出代码格式的情况下,在注释中进行描述并不理想。如果我只是对现有答案提供一两个句子,那我觉得更适合作为评论。
Marplesoft

9

感谢@Barmar和@Marplesoft提供了一些不错的简单解决方案-这是其他人可能喜欢的另一种变体-该函数可以使用pr以下命令告诉您缩进级别:

indent() {
  local indentSize=2
  local indent=1
  if [ -n "$1" ]; then indent=$1; fi
  pr -to $(($indent * $indentSize))
}

# Example usage
ls -al | indent
git status | indent 2

2
好答案。FWIW,在((...))内不需要'$'。见github.com/koalaman/shellcheck/wiki/SC2004
jblaine

无论如何,有什么可以使Bash颜色转义起作用?
雪橇

@Sled如果ls您可以使用以下--color=always选项:ls -al --color=always | indent。来源:此StackExchange线程
Archangel1C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.