这个问题是由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行。
答案 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脚本的人来说,也许会立即明白意图。