即使set -x生效,如何从shell脚本获取干净的消息

时间:2016-03-03 11:18:20

标签: bash shell jenkins echo

这个问题是由Jenkins的工作和他们的执行shell 构建步骤推动的。 Jenkins默认使用sh开关调用-x,这会回显它执行的命令。这绝对是好的和理想的行为。但是,除了使set -x生效之外,能够很好地打印消息是非常好的。一个例子如下:

如果构建步骤脚本中有echo Next we fix a SNAFU,则构建的控制台输出将具有

+ echo Next we fix a SNAFU
Next we fix a SNAFU

只有单行才会好得多,

Next we fix a SNAFU

如何实现这一目标?解决方案是理想的通用sh解决方案,但Jenkins特定的解决方案也很好。并且解决方案在shell脚本源中也应该非常好看,因为回声的双重目的是记录脚本,并使输出更清晰。

所以只用

围绕每个回声
set +x
echo Message
set -x

不是很好,因为它会在每条消息之前打印+ set +x,并且在脚本中也占用3行。

2 个答案:

答案 0 :(得分:1)

set +x

<command>

set -x

这将禁用<command>

的打印

答案 1 :(得分:0)

我找到了两个解决方案,既不理想,但两者都很好。

我第一次更喜欢这个。没有echo Message,而是

true Message

将显示

+ true Message

这很有效,因为true ignores its command line arguments(主要是)。下行是消息之前的+ true混乱,并且可能会对稍后阅读该脚本的其他人使用true命令造成混淆。此外,如果关闭echo,则不会显示该消息。

另一种方法是做这样的回声:

( set +x;echo Message )

将打印

+ set +x
Message

这很有效,因为()中的命令是executed in a subshell,因此像set这样的更改不会影响父shell。这样做的缺点是,它使得脚本有点难看并且写得更加冗长,而且还有一个额外的输出线。此外,这会产生一个额外的子shell,这可能会略微影响构建性能(特别是如果在Windows下的Cygwin下构建)。肯定的是,如果回声关闭,它也会打印消息,对于那些知道shell脚本的人来说,也许会立即明白意图。